Java8 Lambda

流 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> 根据对流中每个项目应用谓词的结果来对项目进行分区
上一篇:实验一 Java开发环境的熟悉


下一篇:List、dictionary、hashtable、ArrayList集合