> Collectors.toCollection() : 用自定义的实现Collection的数据结构收集
Stage 1:准备工作,实体类实现Comparable接口
【终端操作】用于对流中的数据进行归集操作
collect方法接受的参数是一个Collector
在Stream接口里面
-
R collect(Supplier supplier, - BiConsumer
super T> accumulator, - BiConsumer
combiner) ;
R collect(Collector super T, A, R> collector);
工具类,提供了很多常见的收集器实现
ArrayList::new,创建一个ArrayList作为累加器
List::add,对流中元素的操作就是直接添加到累加器中
reduce 操作,对子任务归集结果addAll,后一个子任务的结果直接全部添加到前一个子任务结果中
CH_ID 是一个unmodifiableSet集合
Collectors.toCollection (LinkedList::new)
Collectors.toCollection (CopyOnWriteArrayList::new)
Collectors.toCollection (TreeSet::new)
TreeSet 的特点是可排序、不重复,即TreeSet要求存放的对象必须是可排序的。如果对象之间不可排序,就会抛出这个异常(cannot be cast to java.lang.Comparable )。
- package com.learning.javalearning.lambda.chapter5;
-
- import lombok.AllArgsConstructor;
- import lombok.Data;
- import lombok.NoArgsConstructor;
-
- @NoArgsConstructor
- @AllArgsConstructor
- @Data
- public class User implements Comparable
{ - private int id;
- private String name;
- private String pwd;
- private int age;
-
- @Override
- public int compareTo(User o) {
- int cmp = age - o.age;
- return cmp != 0 ? cmp : name.compareTo(o.name);
- }
-
- @Override
- public String toString() {
- return "User{" +
- "id=" + id +
- ", name='" + name + '\'' +
- ", pwd='" + pwd + '\'' +
- ", age=" + age +
- '}';
- }
-
- public User(String name, int age) {
- this.name = name;
- this.age = age;
- }
-
- public User(int id, String name, String pwd) {
- this.id = id;
- this.name = name;
- this.pwd = pwd;
- }
-
- public User(int id, String name, int age) {
- this.id = id;
- this.name = name;
- this.age = age;
- }
- }
- import com.learning.javalearning.lambda.chapter5.User;
-
- import java.util.*;
- import java.util.concurrent.CopyOnWriteArrayList;
- import java.util.stream.Collectors;
-
- public class CollectDemo {
- public static void main(String[] args) {
- List
list = Arrays.asList(new User(1, "陆小凤", 19), - new User(2, "西门吹雪", 20),
- new User(3, "西门吹雪", 20),//思考为什么返回TreeSet这个User会删除
- new User(4, "叶孤城", 20));
- List
result = list.stream().collect(Collectors.toList()); - System.out.println("【不常用】Collectors.toCollection()返回自定义类型:如 Linkedlist");
-
- List
linkedList = list.stream().collect(Collectors.toCollection(LinkedList::new)); - List
copyOnWriteArrayList = list.stream().collect(Collectors.toCollection(CopyOnWriteArrayList::new)); - Set
treeSet = list.stream().collect(Collectors.toCollection(TreeSet::new)); - System.out.println("LinkedList:" + linkedList);
- System.out.println("CopyOnWriteArrayList:" + copyOnWriteArrayList);
- System.out.println("TreeSet:" + treeSet);
-
- System.out.println("【常用】直接返回:Collectors.toXXX()");
- List
list1 = list.stream().collect(Collectors.toList()); - Set
set = list.stream().collect(Collectors.toSet()); - Map
map = list.stream().collect(Collectors.toMap(User::getId, User::getName)); - System.out.println("toList:" + list1);
- System.out.println("toSet():" + set);
- System.out.println("toMap():" + map);
- }
- }

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