流 lambda 的使用
@Data
@Builder
public class Student {
private String name;
private Integer sex;
private Integer age;
}
// 构建一个学生和课程成绩的关系,来测试lambda表达式
List<Student> studentList = new ArrayList<>();
studentList.add(Student.builder().name("aa").age(11).sex(1).build());
studentList.add(Student.builder().name("bb").age(12).sex(0).build());
studentList.add(Student.builder().name("cc").age(10).sex(1).build());
studentList.add(Student.builder().name("dd").age(12).sex(0).build());
studentList.add(Student.builder().name("ee").age(12).sex(1).build());
studentList.add(Student.builder().name("ff").age(10).sex(0).build());
studentList.add(Student.builder().name("gg").age(11).sex(1).build());
studentList.add(Student.builder().name("hh").age(13).sex(1).build());
studentList.add(Student.builder().name("ii").age(12).sex(0).build());
studentList.add(Student.builder().name("jj").age(11).sex(0).build());
// 计算年龄最大的学生
Student ageMax = studentList.stream().max(Comparator.comparing(Student::getAge)).get();
System.out.println("年龄最大的学生为:" + ageMax.getName() + " 年龄为:" + ageMax.getAge());
// 计算年龄最小的学生
Student ageMin = studentList.stream().min(Comparator.comparing(Student::getAge)).get();
System.out.println("年龄最小的学生为:" + ageMin.getName() + " 年龄为:" + ageMax.getAge());
// 年龄大于10岁的学生的数量
long gt10 = studentList.stream().filter(s -> s.getAge() > 10).count();
System.out.println("年龄大于10岁的学生的数量:" + gt10);
// 每一个年龄段的学生的数量
Map<Integer, Long> collect = studentList.stream().collect(Collectors.groupingBy(Student::getAge, Collectors.counting()));
System.out.println("每个年龄段的学生的数量:" + collect);
// 将学生按照性别分组
Map<Integer, List<Student>> collect1 = studentList.stream().collect(Collectors.groupingBy(Student::getSex, Collectors.toList()));
System.out.println("将学生按照性别分组" + collect1);
// 将学生按照性别分组后 只获取学生的姓名
Map<Integer, Set<String>> collect2 = studentList.stream().collect(Collectors.groupingBy(Student::getSex, Collectors.mapping(Student::getName, Collectors.toSet())));
System.out.println("将学生按照性别分组后,只取学生的姓名:" + collect2);
// 对所有的学生年龄+1
List<Student> collect3 = studentList.stream().map(s -> {
s.setAge(s.getAge() + 1);
return s;
}).collect(Collectors.toList());
System.out.println("将所有学生年龄+1:" + collect3);
// 将学生按照年龄进行排序
List<Student> sorted = studentList.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());
System.out.println("将学生按照年龄进行排序:" + sorted);
// reduce 操作 将集合中的元素求和
Optional<Integer> total = Stream.of(1, 2, 3, 4, 5).reduce((x, y) -> x + y);
Integer total2 = Stream.of(1, 2, 3, 4, 5).reduce(0, (x, y) -> x + y);
// 将 List 转为 Map
List<Integer> collect4 = Stream.of(1, 2, 3, 4).collect(Collectors.toList());
Map<Integer, Integer> collect5 = collect4.stream().collect(Collectors.toMap(x -> x, x -> x + 1, (x, y) -> y));
System.out.println("list 转 Map:" + collect5);
Collectors 类的静态工厂方法。
工厂方法 | 返回类型 | 作用 |
---|---|---|
toList | List |
把流中所有项目收集到一个 List |
toSet | Set |
把流中所有项目收集到一个 Set,删除重复项 |
toCollection | Collection |
把流中所有项目收集到给定的供应源创建的集合menuStream.collect(toCollection(), ArrayList::new) |
counting | Long | 计算流中元素的个数 |
sumInt | Integer | 对流中项目的一个整数属性求和 |
averagingInt | Double | 计算流中项目 Integer 属性的平均值 |
summarizingInt | IntSummaryStatistics | 收集关于流中项目 Integer 属性的统计值,例如最大、最小、 总和与平均值 |
joining | String | 连接对流中每个项目调用 toString 方法所生成的字符串collect(joining(", ")) |
maxBy | Optional |
一个包裹了流中按照给定比较器选出的最大元素的 Optional, 或如果流为空则为 Optional.empty() |
minBy | Optional |
一个包裹了流中按照给定比较器选出的最小元素的 Optional, 或如果流为空则为 Optional.empty() |
reducing | 归约操作产生的类型 | 从一个作为累加器的初始值开始,利用 BinaryOperator 与流 中的元素逐个结合,从而将流归约为单个值累加int totalCalories = menuStream.collect(reducing(0, Dish::getCalories, Integer::sum)); |
collectingAndThen | 转换函数返回的类型 | 包裹另一个收集器,对其结果应用转换函数int howManyDishes = menuStream.collect(collectingAndThen(toList(), List::size)) |
groupingBy | Map<K, List |
根据项目的一个属性的值对流中的项目作问组,并将属性值作 为结果 Map 的键 |
partitioningBy | Map<Boolean,List |
根据对流中每个项目应用谓词的结果来对项目进行分区 |