Java如何将List转成Map,及其细节(Java中用Stream)

Java如何将List转成Map,及其细节(Java中用Stream)

详细看代码

package com.example.demo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 通过 Stream 的 API 将 List 转 Map
 */
public class TestListToMapWithStreamApi {
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class MyEnt {
        private String key;
        private String value;
    }

    public static void main(String[] args) {
        MyEnt m1 = new MyEnt("my_key1", "Stone");
        MyEnt m2 = new MyEnt("my_key2", "Cassie");
        MyEnt m3 = new MyEnt("my_key1", "Stone2");

        // 构造 List
        List<MyEnt> list = new ArrayList<>();
        list.add(m1);
        list.add(m2);
        list.add(m3);

        // 【将List转Map】
        // 【1】强烈建议使用三参数的接口,否则在key出现重复后会出现运行时异常
        // Map<String, MyEnt> map0 = list.stream().collect(Collectors.toMap(x -> x.getKey(), x -> x));
        // System.out.println(map0);// Duplicate key TestListToMapWithStreamApi.MyEnt(key=my_key1, value=Stone)

        // 【2】三参接口:第一个指明什么作为key,第二个指明什么作为value,第三个是在key出现重复后如何处理
        Map<String, MyEnt> map1 = list.stream().collect(Collectors.toMap(x -> x.getKey(), x -> x, (k1, k2) -> k1));
        System.out.println(map1);

        // 【3】关于第三个参数的细节:含义是k1和k2假设key冲突保留谁的意思,上面那个方法保留k1,下面这个保留k2,两者打印的结果是不一样的,观察value值即可知道结论。
        Map<String, MyEnt> map2 = list.stream().collect(Collectors.toMap(x -> x.getKey(), x -> x, (k1,k2) -> k2));
        System.out.println(map2);
    }
}


上一篇:Java8新特性之stream流操作使用


下一篇:Java8新特性:Stream常用方法