偶然间看到小伙伴有段代码基于Stream流通过map()
修改属性,使用collect(Collectors.toList())
将流转为集合, 但是为什么数据源的值会变掉 ?
我是这样理解的,不知道对不对,欢迎指正,基于数据源转为stream()
流,然后基于流可以进行零个多个比如filter()
、map()
中间操作,通过collect()
、sum()
等终端操作进行流的收集并关闭流, 整个过程不会对数据源本身进行修改,只是基于流进行处理并转化为一个新的结果, 但是结果与预期不一致, 查看文档初步猜想是干扰导致的, 但是源码看不太懂,没法断定是什么原因导致的, 还希望大佬能够指点下,测试代码如下:
public static void main(String[] args) {
// 准备数据
List<HashMap<String, String>> initData = new ArrayList<HashMap<String, String>>() {{
add(new HashMap<String, String>() {{put("name", "张三");}});
add(new HashMap<String, String>() {{put("name", "李四");}});
add(new HashMap<String, String>() {{put("name", "王五");}});
}};
// 处理 initData
initData.stream().map(data -> data.put("age", "18"));
System.out.println(initData);
// 打印结果: [{name=张三}, {name=李四}, {name=王五}]
initData.stream().map(data ->data.put("age","18")).collect(Collectors.toList());
System.out.println(initData);
// 打印结果: [{name=张三, age=18}, {name=李四, age=18}, {name=王五, age=18}]
}
这是因为对象同引用的原因呀,流里得到的每个元素是一个对象的地址,你在两个
List
在同一个位置都是指向同一个HashMap
对象,因此你的put
操作会直接修改到这个对象。如果不想产生相同的引用,你得对每个子元素都重新创建一个
HashMap
: