使用 Stream API 将 ArrayList 的嵌套映射转换为单行 - Java 函数式编程



我仍然不擅长函数式编程,因此需要帮助。你能帮我使用流 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, 你仍然总是只是在列表周围传递。

这将对您有所帮助。