• 一文掌握 Java8 Stream 中 Collectors 的 24 个操作


    Java8 应该算是业界主版本了,版本中重要性很高的一个更新是Stream流处理。关于流处理内容比较多,本文主要是说一下Stream中的Collectors工具类的使用。

    Collectors是java.util.stream包下的一个工具类,其中各个方法的返回值可以作为java.util.stream.Stream#collect的入参,实现对队列的各种操作,包括:分组、聚合等。官方文档给出一些例子:

    Implementations of {@link Collector} that implement various useful reduction operations, such as accumulating elements into collections, summarizing elements according to various criteria, etc.

    The following are examples of using the predefined collectors to perform common mutable reduction tasks:

    // Accumulate names into a List
    List list = people.stream().map(Person::getName).collect(Collectors.toList());
    // Accumulate names into a TreeSet
    Set set = people.stream().map(Person::getName).collect(Collectors.toCollection(TreeSet::new));
    // Convert elements to strings and concatenate them, separated by commas
    String joined = things.stream()
    .map(Object::toString)
    .collect(Collectors.joining(", "));
    // Compute sum of salaries of employee
    int total = employees.stream()
    .collect(Collectors.summingInt(Employee::getSalary)));
    // Group employees by department
    Map> byDept = employees.stream()
    .collect(Collectors.groupingBy(Employee::getDepartment));
    // Compute sum of salaries by department
    Map totalByDept = employees.stream()
    .collect(Collectors.groupingBy(Employee::getDepartment, Collectors.summingInt(Employee::getSalary)));
    // Partition students into passing and failing
    Map> passingFailing = students.stream()
    .collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD));

    定义示例数据

    先定义待操作对象,一个万能的Student类(用到了 lombok):

    1. @Data
    2. @AllArgsConstructor
    3. public class Student {
    4.     private String id;
    5.     private String name;
    6.     private LocalDate birthday;
    7.     private int age;
    8.     private double score;
    9. }

    然后定义一组测试数据:

    1. final List<Student> students = Lists.newArrayList();
    2. students.add(new Student("1""张三", LocalDate.of(2009, Month.JANUARY, 1), 1212.123));
    3. students.add(new Student("2""李四", LocalDate.of(2010, Month.FEBRUARY, 2), 1122.123));
    4. students.add(new Student("3""王五", LocalDate.of(2011, Month.MARCH, 3), 1032.123));

    数据统计

    元素数量:counting

    这个比较简单,就是统计聚合结果的元素数量:

    1. // 3
    2. students.stream().collect(Collectors.counting())

    平均值:averagingDouble、averagingInt、averagingLong

    这几个方法是计算聚合元素的平均值,区别是输入参数需要是对应的类型。

    比如,求学生的分数平均值,因为分数是double类型,所以在不转类型的情况下,需要使用averagingDouble:

    1. // 22.123
    2. students.stream().collect(Collectors.averagingDouble(Student::getScore))

    如果考虑转换精度,也是可以实现:

    1. // 22.0
    2. students.stream().collect(Collectors.averagingInt(s -> (int)s.getScore()))
    3. // 22.0
    4. students.stream().collect(Collectors.averagingLong(s -> (long)s.getScore()))

    如果是求学生的平均年龄,因为年龄是int类型,就可以随意使用任何一个函数了:

    1. // 11.0
    2. students.stream().collect(Collectors.averagingInt(Student::getAge))
    3. // 11.0
    4. students.stream().collect(Collec
  • 相关阅读:
    C++项目实战——基于多设计模式下的同步&异步日志系统-③-前置知识补充-设计模式
    KubernetesNode节点配置
    python多分支选择结构实例讲解
    Java EE——阻塞队列
    《QT从基础到进阶·十八》QT中的各种鼠标事件QEvent
    基于SSM的个人博客系统设计与实现(Java+MySQL)
    opengl 选择对象,正投影,透视投影 显示3d坐标 pyqt
    【软考软件评测师】第十四章 白盒测试基础
    【ACWing 算法基础】栈和队列(用数组构造栈和队列)
    企业实施SRM系统应该避开哪些误区?
  • 原文地址:https://blog.csdn.net/Java_zhujia/article/details/128144739