• 【JDK 8 -收集和统计】7.1 collector 收集器


    一、collect()方法

    二、两个重载方法

    2.1 方法一

    2.2 方法二(常用)

    三、Collector 的 作用

    四、Collectors 的作用

    > Collectors.toList() 

    > Collectors.toMap()

    > Collectors.toSet()

    > Collectors.toCollection() : 用自定义的实现Collection的数据结构收集

    五、实战

    Stage 1:准备工作,实体类实现Comparable接口

    Stage 2:示例

    执行结果


    一、collect()方法

    • 终端操作用于对流中的数据进行归集操作

    • collect方法接受的参数是一个Collector

    二、两个重载方法

    • 在Stream接口里面

    2.1 方法一

    1. R collect(Supplier supplier,
    2. BiConsumersuper T> accumulator,
    3. BiConsumer combiner);

    2.2 方法二(常用)

      R collect(Collectorsuper T, A, R> collector);

    三、Collector 的 作用

    • 就是收集器,也是一个接口,它的工具类Collectors提供了很多工厂方法

    四、Collectors 的作用

    • 工具类提供了很多常见的收集器实现

    > Collectors.toList() 

    • ArrayList::new,创建一个ArrayList作为累加器

    • List::add,对流中元素的操作就是直接添加到累加器中

    • reduce 操作,对子任务归集结果addAll,后一个子任务的结果直接全部添加到前一个子任务结果中

    • CH_ID 是一个unmodifiableSet集合

    Collectors.toMap()

    Collectors.toSet()

    Collectors.toCollection() : 用自定义的实现Collection的数据结构收集

    • Collectors.toCollection (LinkedList::new)

    • Collectors.toCollection (CopyOnWriteArrayList::new)

    • Collectors.toCollection (TreeSet::new)

    五、实战

    Stage 1:准备工作,实体类实现Comparable接口

    • TreeSet 的特点是可排序、不重复,即TreeSet要求存放的对象必须是可排序的。如果对象之间不可排序,就会抛出这个异常(cannot be cast to java.lang.Comparable )。

    1. package com.learning.javalearning.lambda.chapter5;
    2. import lombok.AllArgsConstructor;
    3. import lombok.Data;
    4. import lombok.NoArgsConstructor;
    5. @NoArgsConstructor
    6. @AllArgsConstructor
    7. @Data
    8. public class User implements Comparable {
    9. private int id;
    10. private String name;
    11. private String pwd;
    12. private int age;
    13. @Override
    14. public int compareTo(User o) {
    15. int cmp = age - o.age;
    16. return cmp != 0 ? cmp : name.compareTo(o.name);
    17. }
    18. @Override
    19. public String toString() {
    20. return "User{" +
    21. "id=" + id +
    22. ", name='" + name + '\'' +
    23. ", pwd='" + pwd + '\'' +
    24. ", age=" + age +
    25. '}';
    26. }
    27. public User(String name, int age) {
    28. this.name = name;
    29. this.age = age;
    30. }
    31. public User(int id, String name, String pwd) {
    32. this.id = id;
    33. this.name = name;
    34. this.pwd = pwd;
    35. }
    36. public User(int id, String name, int age) {
    37. this.id = id;
    38. this.name = name;
    39. this.age = age;
    40. }
    41. }

    Stage 2:示例

    1. import com.learning.javalearning.lambda.chapter5.User;
    2. import java.util.*;
    3. import java.util.concurrent.CopyOnWriteArrayList;
    4. import java.util.stream.Collectors;
    5. public class CollectDemo {
    6. public static void main(String[] args) {
    7. List list = Arrays.asList(new User(1, "陆小凤", 19),
    8. new User(2, "西门吹雪", 20),
    9. new User(3, "西门吹雪", 20),//思考为什么返回TreeSet这个User会删除
    10. new User(4, "叶孤城", 20));
    11. List result = list.stream().collect(Collectors.toList());
    12. System.out.println("【不常用】Collectors.toCollection()返回自定义类型:如 Linkedlist");
    13. List linkedList = list.stream().collect(Collectors.toCollection(LinkedList::new));
    14. List copyOnWriteArrayList = list.stream().collect(Collectors.toCollection(CopyOnWriteArrayList::new));
    15. Set treeSet = list.stream().collect(Collectors.toCollection(TreeSet::new));
    16. System.out.println("LinkedList:" + linkedList);
    17. System.out.println("CopyOnWriteArrayList:" + copyOnWriteArrayList);
    18. System.out.println("TreeSet:" + treeSet);
    19. System.out.println("【常用】直接返回:Collectors.toXXX()");
    20. List list1 = list.stream().collect(Collectors.toList());
    21. Set set = list.stream().collect(Collectors.toSet());
    22. Map map = list.stream().collect(Collectors.toMap(User::getId, User::getName));
    23. System.out.println("toList:" + list1);
    24. System.out.println("toSet():" + set);
    25. System.out.println("toMap():" + map);
    26. }
    27. }

    执行结果

     

    六、参考

    如何解决 cannot be cast to java.lang.Comparable问题?_msg1_的博客-CSDN博客

  • 相关阅读:
    智能驾驶ADAS算法设计及Prescan仿真(3): 自适应巡航ACC跟车目标选择策略设计与simulink仿真
    基于SSM的失物招领信息交互平台
    Unity开发——XLua热更新之Hotfix配置(包含xlua获取与导入)
    亚马逊英国站小风扇UKCA认证办理流程
    前端数据加解密:保护敏感信息的关键
    C语言中最难啃的硬骨头非这三个莫属
    前端为什么要工程化
    Unity新的Input System
    智能指针unique_ptr
    A O P
  • 原文地址:https://blog.csdn.net/ladymorgana/article/details/133079993