比如这样一个需求,现有一个Teacher对象集合和一个Student对象集合,需要查出两个集合中姓名相同的记录该怎么办呢,通常我们想到的肯定是用双层for循环来做,如果用java8新特性lambda表达式怎么做呢?废话不多说,直接看示例:
新建老师类:
package demo;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* 老师类
*/
@Data
@AllArgsConstructor
public class Teacher {
private Long id;
private String name;
}
新建学生类:
package demo;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* 学生类
*/
@Data
@AllArgsConstructor
public class Student {
private Long id;
private String name;
}
测试代码:
package demo;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
public class Java8Test {
public static void main(String[] args) {
// 老师集合
List<Teacher> teachers = Arrays.asList(
new Teacher(1L, "张三"),
new Teacher(2L, "李四"),
new Teacher(3L, "王五"),
new Teacher(4L, "赵六"));
// 学生集合
List<Student> students = Arrays.asList(
new Student(5L, "张三"),
new Student(6L, "李四"),
new Student(7L, "小红"),
new Student(8L, "小明"));
// 求同时出现在老师集合和学生集合中的人数,name相同即视为同一个人
int size = teachers.stream()
.map(t -> students.stream().filter(s -> Objects.nonNull(t.getName()) && Objects.nonNull(s.getName()) && Objects.equals(t.getName(), s.getName())).findAny().orElse(null))
.filter(Objects::nonNull)
.collect(Collectors.toList())
.size();
// 求同时出现在老师集合和学生集合中人的name集合,name相同即视为同一个人
List<String> names = teachers.stream()
.map(t -> students.stream().filter(s -> Objects.nonNull(t.getName()) && Objects.nonNull(s.getName()) && Objects.equals(t.getName(), s.getName())).findAny().orElse(null))
.filter(Objects::nonNull)
.map(r -> r.getName())
.collect(Collectors.toList());
System.out.println("相同的人数:" + size);
System.out.println("相同的人姓名集合:" + names);
}
}
测试结果: