1、map中进行set操作是否会影响原集合中的数据?会。同理,filter、peek、foreach中set操作都会影响原集合的数据。例如:
SysNotice notice1 = new SysNotice();
notice1.setNoticeTitle("测试1");
notice1.setCreateTime(LocalDateTime.now());
SysNotice notice2 = new SysNotice();
notice2.setNoticeTitle("测试2");
notice2.setCreateTime(LocalDateTime.now());
List<SysNotice> list = new ArrayList<>();
list.add(notice1);
list.add(notice2);
List<SysNotice> list1 = list.stream().map(c -> {
c.setNoticeTitle("xxxxx");
return c;
}).collect(Collectors.toList());
System.out.println(list);
运行结果:
【注意】:若不加collect(Collectors.toList())则不会修改原集合,因为stream只在遇到终结操作的时候才会执行,比如:
List.of(1, 2, 3).stream()
.filter(i -> i > 2)
.peek(System.out::println);
这么一段代码是不会执行的,因为filter方法和peek方法都是转换流方法,所以不会触发执行。
2、若不想影响原集合的数据,应该怎么做?重新new一个对象即可。例如:
public static void main(String[] args) {
List<Person> originalList = new ArrayList<>();
originalList.add(new Person("Alice", 1));
originalList.add(new Person("Bob", 2));
originalList.add(new Person("Charlie", 1));
originalList.add(new Person("David", 2));
List<Person> newList = originalList
.stream()
.map(person -> new Person(person.getName(), person.getSex() == 1 ? "男" : "女"))
.collect(Collectors.toList());
System.out.println(originalList);
}