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

并行流:

复制代码
相关推荐
用户3521802454758 小时前
当 Prompt 学会"热更新":Spring Boot × Nacos3 AI 实战
java·spring boot·ai编程
东坡白菜11 小时前
破局全栈:一个前端开发的Java入门实战记录(1)
java·全栈
唐青枫11 小时前
Java Tomcat 实战指南:从 Servlet 容器到 Spring Boot 部署
java
wsaaaqqq11 小时前
roudan:自由选择实体、灵活操作数据、快速写入数据库的 Java 框架
java
plainGeekDev15 小时前
null 判断 → Kotlin 可空类型
android·java·kotlin
糖拌西瓜皮15 小时前
Java开发者视角:深入理解Node.js异步编程模型
java·后端·node.js
plainGeekDev15 小时前
getter/setter → Kotlin 属性
android·java·kotlin
一线大码15 小时前
Smart-Doc 的简单使用
java·后端·restful
MacroZheng16 小时前
Claude Code官方桌面端正式发布,夯爆了!
java·人工智能·后端