Java 8列表到现有地图

时间:2017-03-21 20:18:39

标签: java dictionary lambda java-8 hashmap

我有一张地图Map<Id,Map<Obj1,Obj2>> existingMap and List<Obj1> list; 我需要添加列表值以映射为键和新Map作为值。

我尝试过这样的事情:

existingMap.putAll(list.stream().map(x->x.getId()).collect(
Collectors.toMap(x, x -> Map<Obj1,Obj2>::new);

我该怎么写呢?如何使用参数化构造函数来防止默认?

2 个答案:

答案 0 :(得分:10)

尝试:

list.forEach(e -> existingMap.put(e.getId(), new HashMap<>()));

仍然使用功能性Java 8功能,效果相同。

for - 循环等效:

for(Id id : list)
    existingMap.put(id.getId(), new HashMap<>());

代码问题:

  • Map是一个界面,无法实例化。例如,使用HashMapTreeMap这样的具体实现。

  • Collectors#toMap接受两个 Function。如果您想使用自己的格式,则需要:

    Collectors.toMap(x -> x, HashMap::new)   
    

    请注意lambda x -> x,而不仅仅是x

    编辑:当然,您可以使用Function.identity(),而不是x -> x,但根据您的需要,此可能更具表现力。

答案 1 :(得分:2)

另一种方法可以是应用收集器的转换:

List<Id> list = ...
Map<Id, Map<Obj1, Obj2>> extension = list.stream().collect(
        toMap(
                identity(),
                value -> new HashMap<Obj1, Obj2>()
        )
);

existingMap.putAll(extension);

您必须添加以下导入才能使其正常工作:

import static java.util.function.Function.identity;
import static java.util.stream.Collectors.toMap;