stream流的toMap

假设有这么一个类:

复制代码
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Student {

    private int id;
    private String name;

    public Student(int id, String name) {
        this.id = id;
        this.name = name;

    }

    public Student() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

使用stream流来将list转map

复制代码
  public void test(){

        List<Student> list = Arrays.asList(
                new Student(1, "张三" ),
                new Student(2, "李四"),
                new Student(3, "赵武" ),
                new Student(4, "王六" )
        );



        /**
         *  key: id
          *value : name
         */
        Map<Integer, String> collect = list.stream()
                .collect(Collectors.toMap(Student::getId, Student::getName));
        System.out.println(collect);

        /**
         * key :id
         * value: student
         */
        Map<Integer, Student> collect1 = list.stream()
                .collect(Collectors.toMap(Student::getId, v -> v));
        System.out.println(collect1);

        /**
         * key :id
         * value: student
         *  但是这种情况是有重复的key 的情况下
         */
        List<Student> list2 = Arrays.asList(
                new Student(1, "张三" ),
                new Student(2, "李四"),
                new Student(3, "赵武" ),
                new Student(1, "王六" )
        );
//        //这种会报错
//        Map<Integer, String> collect2 = list2.stream()
//                .collect(Collectors.toMap(Student::getId, Student::getName));
//        System.out.println(collect2);

        //稍微处理一下重复的key的问题
        HashMap<Integer, String> collect3 = list2.stream()
                .collect(Collectors.toMap(Student::getId, Student::getName, (n1, n2) -> n2, HashMap::new));
        System.out.println(collect3);

    }

运行结果如下:

复制代码
{1=张三, 2=李四, 3=赵武, 4=王六}
{1=Student{id=1, name='张三'}, 2=Student{id=2, name='李四'}, 3=Student{id=3, name='赵武'}, 4=Student{id=4, name='王六'}}
{1=王六, 2=李四, 3=赵武}

源码:

复制代码
    public static <T, K, U>
    Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                    Function<? super T, ? extends U> valueMapper) {
        return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
    }

这种没有对key重复的时候做处理,在实际开发中肯定会考虑导key是否重复的场景;

下面这种方式可以将处理后的数据返回到一个新的map(指定的容器)之中

复制代码
    public static <T, K, U, M extends Map<K, U>>
    Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
                                Function<? super T, ? extends U> valueMapper,
                                BinaryOperator<U> mergeFunction,
                                Supplier<M> mapSupplier) {
        BiConsumer<M, T> accumulator
                = (map, element) -> map.merge(keyMapper.apply(element),
                                              valueMapper.apply(element), mergeFunction);
        return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
    }

并行流:

复制代码
相关推荐
柯南二号1 小时前
【Java后端】Spring Boot 集成 MyBatis-Plus 全攻略
java·spring boot·mybatis
阿珊和她的猫4 小时前
v-scale-scree: 根据屏幕尺寸缩放内容
开发语言·前端·javascript
fouryears_234176 小时前
Flutter InheritedWidget 详解:从生命周期到数据流动的完整解析
开发语言·flutter·客户端·dart
我好喜欢你~7 小时前
C#---StopWatch类
开发语言·c#
桦说编程8 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
lifallen8 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研8 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
没有bug.的程序员9 小时前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
甄超锋9 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
cui__OaO10 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习