@Test
public void testChangeStudents() {
List<Student> students = new ArrayList<Student>() {{
add(Student.builder().age(50).build());
add(Student.builder().age(100).build());
}};
filterStudent1(students);
//结果不变 因为改变的是传给filterStudent1的新的引用指向
System.out.println(ObjectMapperUtils.toJSON(students));
filterStudent2(students);
System.out.println(ObjectMapperUtils.toJSON(students));
changeStudents(students);
System.out.println(ObjectMapperUtils.toJSON(students));
}
private void filterStudent1(List<Student> students) {
//传入这里的students 是从对象上复制出来的一个地址,和调用方不是一个引用;改变这个引用的指向不会影响调用方持用的引用
students = students.stream()
.filter(student -> student.getAge() > 50)
.collect(Collectors.toList());
}
private void filterStudent2(List<Student> students) {
//但如果改变了引用的地址上对象的内容,则会影响对象。传入这里的引用和调用方持有的引用因为是同一个对象,所以调用方也看到了对象的变化
students.remove(0);
}
private void changeStudents(List<Student> students) {
//change 同理
students.forEach(s -> s.setAge(s.getAge() + 1));
}
@Test
public void testChangePeople() {
Student s = Student.builder()
.age(1L)
.addr("xx")
.build();
changePeople(s);
System.out.println(s.getAge());
}
private void changePeople(Student s) {
s.setAge(100L);
}