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

并行流:

复制代码
相关推荐
imDwAaY9 分钟前
程序里的地址是真实内存地址吗?从虚拟内存到地址转换
java·linux·服务器
承渊政道21 分钟前
【Python编程—从入门到实践】(让程序记得、恢复并解释失败:Python 文件、异常与JSON系统教程)
开发语言·python·pycharm·json·异常处理
秋饼24 分钟前
Claude Haiku 5.5 + Spring AI 2.0 企业级低成本高并发 AI Agent 实战:子智能体分工、成本熔断与百万上下文落地
java·ai·技术分享·后端开发
一水鉴天34 分钟前
声调韵的序:从古汉语音韵到系统科学语言的场效应推演 20261013(千问)
开发语言·人工智能
郭庆汝34 分钟前
(六)MCP+A2A之——Playwright与BrowserUse:让AI学会像人类一样使用浏览器
开发语言·python
xuxigifxfh39 分钟前
牛客:BISHI8 大整数哈希
java·算法·哈希算法
涉密IT资质笔记42 分钟前
涉密资质投入产出分析模型:时间成本、四块成本构成与 ROI 决策框架
java·开发语言·算法
木井巳44 分钟前
【BFS 解决拓扑排序】火星词典
java·算法·leetcode·广度优先·宽度优先·图搜索算法
霸道流氓气质1 小时前
Java调用StableDiffusion/ComfyUI图像生成:DAG工作流编排、WebSocket实时进度与Flux模型集成的生产级实战
java·websocket·stable diffusion
北风toto1 小时前
KMP 算法详解:从暴力匹配到 O(n+m) 的字符串搜索
java·开发语言·算法