我仍然不擅长函数式编程,因此需要帮助。你能帮我使用流 API 写同样的东西吗?
提前谢谢。
Map<Integer, Map<Integer, ArrayList<Integer>>> map = new TreeMap<>();
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
for(Map.Entry<Integer, Map<Integer, ArrayList<Integer>>> ele: map.entrySet()){
ArrayList<Integer> temp = new ArrayList<>();
for(Map.Entry<Integer, ArrayList<Integer>> ent: ele.getValue().entrySet()){
temp.addAll(ent.getValue());
}
result.add(temp);
}
这是我的方法。但是有一些错误。
System.out.println(
map.values()
.stream()
.map(ins -> {
ArrayList<Integer> temp = new ArrayList<>();
ins.values().stream().forEach(temp::addAll);
return temp;
})
.collect(Collectors.toList()));
你可以试试平面地图
另外,不要直接使用temp::addAll
,您需要尝试如下。
Update1
System.out.println(
map.entrySet()
.stream()
.flatMap(ins -> ins.getValue().entrySet().stream()
.map(integerListEntry -> integerListEntry.getValue())).collect(Collectors.toList()));
更新2
System.out.println(
Arrays.asList(map.entrySet().stream()
.flatMap(ins -> ins.getValue().entrySet().stream()
.flatMap(integerListEntry->integerListEntry.getValue().stream())).collect(Collectors.toList())));
您还可以创建方法引用,如下所述。在这里,我创建了带有flatteringInnerMap
的方法名称,并简单地通过方法引用调用它。
System.out.println(
map.entrySet()
.stream()
.flatMap(ins -> ins.getValue().entrySet().stream()
.flatMap(Sample::flatteringInnerMap)).collect(Collectors.toList()));
}
private static Stream<? extends Integer> flatteringInnerMap(Map.Entry<Integer, List<Integer>> integerListEntry) {
return integerListEntry.getValue().stream();
}
更多关于平面地图,你会得到的想法here.
我想在这里再补充一点。
我建议使用
"List"
而不是"ArrayList"
创建列表对象时的左侧。最好通过 界面"List"
因为如果以后你需要更改为 使用类似 Vector 的东西(例如,您现在需要同步列表), 您只需要使用"new"语句更改行。不管怎样 您使用的列表的实现方式,例如Vector or ArrayList
, 你仍然总是只是在列表周围传递。
这将对您有所帮助。