使用Java 8将列表转换为地图

时间:2019-05-25 18:35:27

标签: java java-8 java-stream

我正在使用Java 8按值代码对地图进行排序。

我已经完成了大多数事情,但是我没有得到如何使用Java 8功能将列表转换为地图的方法

public class SortMapByValue {
public static void main(String[] args) {
    HashMap<String, Integer> map = new HashMap<>();
    map.put("A", 3);
    map.put("V", 1);
    map.put("Anss", 9);
    map.put("D", 5);
    map.put("E", 2);
    map.put("F", 10);

    HashMap<String, Integer> newMap = new LinkedHashMap<>();

    List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());


    Collections.sort(list, (o1, o2) -> o1.getValue() - o2.getValue());

    // Need to this using Java 8 -- start

    for (Entry<String, Integer> entry : list) {
        newMap.put(entry.getKey(), entry.getValue());
    } 

    // Need to this using Java 8 -- end

    newMap.forEach((k, v) -> System.out.println("Key : " + k + " Value : " + v));

    }
}

2 个答案:

答案 0 :(得分:5)

如果要基于值对Map进行排序,请使用Entry.comparingByValue(),然后将它们收集到LinkedHashMap中:

Map<String,Integer> result =   map.entrySet()
       .stream()
       .sorted(Entry.comparingByValue())
       .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (a,b) -> b, LinkedHashMap::new));

Java-8中有3种重载的toMap方法,上面的方法有4个参数,即

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)

参数:

  

keyMapper-生成键的映射函数

     

valueMapper-用于生成值的映射函数

     

mergeFunction-合并函数,用于解决之间的冲突   与提供给Map.merge(Object,Object,BiFunction)的键相同的值

     

mapSupplier-返回新的空Map并将结果插入其中的函数

答案 1 :(得分:1)

Map map = list.stream().collect(
    Collectors.toMap(
        entry -> entry.getKey(), // keyMapper
        entry -> entry.getValue(), // valueMapper
        (first, second) -> first,  // mergeFunction
        () -> new LinkedHashMap<>() // mapFactory
    )
);

请参见StreamCollectors

您甚至可以这样做:

public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("A", 3);
        map.put("V", 1);
        map.put("Anss", 9);
        map.put("D", 5);
        map.put("E", 2);
        map.put("F", 10);

        Map newMap = map.entrySet().stream()
            .sorted(Map.Entry.comparingByValue())
            .collect(
                Collectors.toMap(
                    entry -> entry.getKey(), // keyMapper
                    entry -> entry.getValue(), // valueMapper
                    (first, second) -> first,  // mergeFunction
                    () -> new LinkedHashMap<>() // mapFactory
                )
            );

        newMap.forEach((k, v) -> System.out.println("Key : " + k + " Value : " + v));

    }