实例化对象的Lambda函数

时间:2016-11-12 04:03:26

标签: java lambda java-stream

我正在尝试将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)
}

2 个答案:

答案 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}}