我有一张地图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);
我该怎么写呢?如何使用参数化构造函数来防止默认?
答案 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
是一个界面,无法实例化。例如,使用HashMap
或TreeMap
这样的具体实现。
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;