【发布时间】:2020-02-02 10:17:58
【问题描述】:
我正在尝试将 3 级嵌套列表转换为嵌套 HashMap。
相同的函数声明是:
Map<Key1, Map<Key2, List<String>>> transformToMap (List<Obj1> inputList)
inputList 内部有嵌套列表,该列表又具有嵌套列表。
我写的代码是使用传统的for循环如下:
private Map<Key1 , Map<Key2, List<String>>> reverseLookup(List<Key2> key2List){
Map<Key1 , Map<Key2, List<String>>> resultMap = new HashMap<>();
key2List.forEach(key2->{
List<ElementObject> elementObjects = key2.getElementObjects();
elementObjects.forEach(elementObject->{
final String name = elementObject.getName();
elementObject.getApplicablePeriods().forEach(applicablePeriod-> {
Key1 key1 = applicablePeriod.getKey1();
Map<Key2, List<String>> map2 = resultMap.get(key1);
if(map2 == null){
map2 = new HashMap<>();
}
List<String> stringList = map2.get(key2);
if(stringList == null){
stringList = new ArrayList<>();
}
stringList.add(name);
map2.put(key2, stringList);
resultMap.put(key1, map2);
});
});
});
return resultMap;
}
类结构如下:
class Key2{
List<ElementObject> elementObjects;
//getters & setters
}
class ElementObject {
String name;
//few more params
List<ApplicablePeriod> applicablePeriods;
//getters & setters
}
class ApplicablePeriod{
Key1 key1;
//getters & setters
}
class Key1{
//some parameters
//getters & setters
}
上面的代码符合我的期望。
使用Collectors.toMap 将其转换为流 lambda 的有效方法是什么?
我尝试了以下方法:
inputList
.stream()
.flatMap(item -> item.getObj2List().stream())
.flatMap(nestedItem -> nestedItem.getKeyList().stream())
.collect(Collectors.toMap(a-> a.get()))
但没有得到Collectors.toMap 中的下一步应该是什么。
无法处理在第三个 for 循环之前使用的 final String name = nestedItem.getName();。
告诉我解决这个问题的方法。
【问题讨论】:
-
到目前为止你尝试过什么?
-
我正在尝试类似:
inputList.stream().flatMap(item -> item.getObj2List().stream()).flatMap(nestedItem -> nestedItem.getKeyList().stream()).collect(Collectors.toMap(a-> a.get()))但没有得到Collectors.toMap的下一步应该是什么。无法处理在第三个 for 循环之前使用的final String name = nestedItem.getName();。 -
编辑问题并更新它,以便人们进一步帮助您。
-
这是在编译吗?似乎当您执行
nestedMap.put(item,stringList);时,您的项目类型为Obj1而它应该是Key2 -
Key2 本质上是一个包含列表的复合对象。你真的想用它作为结果地图的键吗?那么
equals()是如何定义的呢?
标签: java lambda java-8 hashmap java-stream