我正在尝试将List转换为地图,其中key是列表的每个元素,值是新的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相关的资源列表(它是1到多个映射)。它需要返回一个地图,其中地图的键集具有所有资源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)
}
答案 0 :(得分:0)
看起来您首先想要使用空值的ArrayList启动一个空的Map,然后用批量调用的结果填充它。
根据您的具体情况,您可以按如下方式组合这些步骤:
Map<String, List<Result>> results = allResults.stream().collect(Collectors.groupingBy(Result::getResourceId));
如果您只对批量提取返回的资源感兴趣,那应该这样做。如果你在没有结果时确实需要一个空列表,你可以稍后解决这个问题,例如。
public List<Result> getResult(String resourceId){
List<Result> resources = results.get(resourceId);
return resources != null ? resources : Collections.emptyList();
}
答案 1 :(得分:0)
您可能需要先创建资源地图,然后再填写缺少的resourceId:
{{1}}