要回答所提出的问题,还有其他方法,但我不会推荐任何我能想到的方法。例如,您可以使用归约:
List<List<Integer>> list2d = List.of(List.of(1, 2), List.of(3, 4));
List<Integer> lst1 = list2d
.stream()
.reduce((l1, l2) -> {
ArrayList<Integer> concatenated = new ArrayList<>(l1);
concatenated.addAll(l2);
return concatenated;
})
.orElse(List.of()); // or else empty list
System.out.println(lst1);
输出与您的相同:
[1、2、3、4]
但是你的代码比我的更容易理解。我建议你坚持下去。
map() 和 flatMap() 不能互换吗?
正因为,如果map可以代替所有的flatMap,那么就没有理由去记住flatMap了。我总是追求简单和基本的东西。
你已经得到了最简单和最基本的东西。此外,为了充分发挥流的潜力,您需要不时使用许多方法调用。在使用流多年后,我仍然发现自己有时会在 Javadoc 中查找它们。我不得不查找reduce()
这个答案的详细信息。不要期望一切都在你的脑海中。不过,我确实知道flatMap()
,因为它通常很实用。
编辑:仅出于学术兴趣:通常您不能替换flatMap()
为map()
. 或者你会map()
从一开始就使用。但反过来:你总是可以map()
用flatMap()
. 你只是不想。例如,如果我们有:
List<String> strings = List.of("short", "somewhat longer");
List<Integer> lengths = strings.stream()
.map(String::length)
.collect(Collectors.toList());
System.out.println(lengths);
[5, 15]
如果出于某种奇怪的原因,我们只能记住flatMap()
,而不是map()
,我们可以这样做:
List<Integer> lengths = strings.stream()
.flatMap(s -> Stream.of(s.length()))
.collect(Collectors.toList());
我认为很明显,它给我们带来的只是不必要的复杂性。最好记住这两者,map()
至少flatMap()
要足够好,以便在我们需要它们时能够查找它们。