原文: https://mp.weixin.qq.com/s/We0lfTr_ahnyVkwxKF0jFw

一、两个集合的交集

例如:找出两个班 名字相同的学生

  1. public class Student {
  2. private String studentNo;
  3. //名字
  4. private String studentName;
  5. public Student(String studentNo, String studentName) {
  6. this.studentNo = studentNo;
  7. this.studentName = studentName;
  8. }
  9. //对象的比较涉及到equals()的重写, 这里仅仅比较studentName是否相同
  10. @Override
  11. public boolean equals(Object o) {
  12. if (this == o) return true;
  13. if (!(o instanceof Student)) return false;
  14. Student student = (Student) o;
  15. return studentName.equals(student.getStudentName());
  16. }
  17. // set()和get()方法均省略..
  18. }

学生是个对象实例,我们要比较的是名字是否相同,仅需要重写 equals() 方法即可

找交集
  1. @Test
  2. public void test(){
  3. // 1班的学生
  4. List<Student> class01=new ArrayList<>();
  5. class01.add(new Student("1","小明"));
  6. class01.add(new Student("2","赵铁柱"));
  7. // 2班的学生
  8. List<Student> class02=new ArrayList<>();
  9. class02.add(new Student("1","赵铁柱"));
  10. // 找两个班名字相同的同学(取交集),比较用的是重写的equals()
  11. List<Student> sameName=class01.stream().filter(class02::contains).collect(Collectors.toList());
  12. sameName.stream().forEach(student->System.out.println(student.getStudentName()+" "));
  13. //output : 赵铁柱
  14. }

需要注意的是:(1) class01.stream().filter(class02::contains)filter()会 保留 符合表达式的结果,这里面表达式的内容是 2 班和 1 班名字相同的同学

(2) forEach 是遍历集合,代替了 for 循环,代码更为简洁

(3) collect(Collectors.toList())collect(Collectors.toSet())collect(Collectors.toMap())将 Stream 的数据归集到 List、Map、Set 等集合

二、差集

输出结果:b c

  1. @Test
  2. public void test(){
  3. List<String> list01=Arrays.asList("a","b","c");
  4. List<String> list02=Arrays.asList("a","e","f");
  5. //list01和list02的差集, 仅保留了 b,c
  6. List<String> result=list01.stream()
  7. .filter(word->!list02.contains(word)).collect(Collectors.toList());
  8. result.stream().forEach(word->System.out.print(word+" "));
  9. }

表达式 list01.stream().filter(word-> ! list02.contains(word)),要找的元素,它的特征是只存在 list01 中,但不存在 list02 中,! list02.contains(word)就是说这个元素不在 list02 中