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);
    }

并行流:

复制代码
相关推荐
Tyler_TXZ11 小时前
C++C语言之——二叉树
c语言·开发语言·数据结构·c++·二叉树
不会代码的小猴11 小时前
C++新增关键字
开发语言·c++·笔记
yaoxin52112311 小时前
497. Java 反射 - 使用反射读取注解
java·开发语言·python
2019一路前行12 小时前
Python 函数式编程
开发语言·python
eralong12 小时前
Java 面向对象:继承、多态、接口
java·后端
哦虎!12 小时前
【数据库】事务
java·数据库·mysql
CDN36012 小时前
流媒体加速实践:出海东南亚短视频点播频繁缓冲,HLS 分片与 Nginx 配置调优
java·网络·nginx·流媒体加速
冯汉栩12 小时前
Swift Control View,Label渐变颜色(源码)
开发语言·ios·swift
程序员黑豆13 小时前
Java中的null与NullPointerException完全指南:安全处理、实战排查与面试题
java·前端·ai编程
晴天1613 小时前
Electron面试题-Day19
java·javascript·electron