【发布时间】:2016-11-12 04:03:25
【问题描述】:
我正在尝试将列表转换为地图,键是列表的每个元素,值是新的 ArrayList。
目前我正在这样做:
List<String> strLst = ...
Map<String, List<Foo>> map = strLst.stream()
.collect(Collectors.toMap(Function.identity(), _unused -> new ArrayList<>()));
有没有比这样做更好的方法:_unused -> new ArrayList<>()?
为了澄清我的用例:
我有一个 API,它接收资源 ID 列表(即上面示例中的 List<String> strLst),我需要获取与每个资源 ID 关联的资源列表(它是一对多映射)。它需要返回一个映射,其中映射的键集具有所有资源 Id。如果资源没有映射,则每个资源 ID 的值都是一个空列表。 (但我希望 map.keySet 等同于原始列表)
我做不到
for (String resourceId : allResourceIds) {
List<Result> results = getResults(resourceId);
map.put (resourceId, results)
}
因为出于性能原因我需要调用批量 API
Map<String, List<Result>> map = ... // this is the step i'm trying to implement
List<Result> allResults = bulkGetResults(allResourceIds)
for (Result res : allResults) {
map.get(res.getResourceId()).add(res)
}
【问题讨论】:
-
如果数组列表有一个构造函数参数(使用起来很有意义)
_unused那么你可以做ArrayList::new但除此之外不是真的。虽然为什么将元素映射到一个空列表,而不是说Collectors#groupingBy -
我会看看这个地图是怎么用的,很可能你不需要这一步。
-
补充说明
标签: java lambda java-stream