如何使用流减少保留所有列表列表
How to retainAll of List of Lists using stream reduce
我遇到了以下问题。我有一个列表列表,我只想保留所有列表。我正在尝试使用流
private List<List<Long>> ids = new ArrayList<List<Long>>();
// some ids.add(otherLists);
List<Long> reduce = ids.stream().reduce(ids.get(0), (a, b) -> a.addAll(b));
不幸的是我得到了错误
Error:(72, 67) java: incompatible types: bad return type in lambda expression
boolean cannot be converted to java.util.List<java.lang.Long>
addAll returns 一个布尔值,不是两个列表的并集。你想要
List<Long> reduce = ids.stream().reduce(ids.get(0), (a, b) -> {
a.addAll(b);
return a;
});
如果你想减少(我认为你的意思是扁平化)列表列表,你应该这样做:
import static java.util.stream.Collectors.toList
...
List<Long> reduce = ids.stream().flatMap(List::stream).collect(toList());
使用 reduce
,第一个值应该是标识值,这在您的实现中不是这种情况,并且您的解决方案在 运行 并行处理流时会产生意外结果(因为 addAll
就地修改列表,在这种情况下,标识值将是部分结果的相同列表)。
您需要复制部分结果列表的内容,并在其中添加另一个列表以使其在管道 运行 并行时工作:
List<Long> reduce = ids.parallelStream().reduce(new ArrayList<>(), (a, b) -> {
List<Long> list = new ArrayList<Long>(a);
list.addAll(b);
return list;
});
我遇到了以下问题。我有一个列表列表,我只想保留所有列表。我正在尝试使用流
private List<List<Long>> ids = new ArrayList<List<Long>>();
// some ids.add(otherLists);
List<Long> reduce = ids.stream().reduce(ids.get(0), (a, b) -> a.addAll(b));
不幸的是我得到了错误
Error:(72, 67) java: incompatible types: bad return type in lambda expression
boolean cannot be converted to java.util.List<java.lang.Long>
addAll returns 一个布尔值,不是两个列表的并集。你想要
List<Long> reduce = ids.stream().reduce(ids.get(0), (a, b) -> {
a.addAll(b);
return a;
});
如果你想减少(我认为你的意思是扁平化)列表列表,你应该这样做:
import static java.util.stream.Collectors.toList
...
List<Long> reduce = ids.stream().flatMap(List::stream).collect(toList());
使用 reduce
,第一个值应该是标识值,这在您的实现中不是这种情况,并且您的解决方案在 运行 并行处理流时会产生意外结果(因为 addAll
就地修改列表,在这种情况下,标识值将是部分结果的相同列表)。
您需要复制部分结果列表的内容,并在其中添加另一个列表以使其在管道 运行 并行时工作:
List<Long> reduce = ids.parallelStream().reduce(new ArrayList<>(), (a, b) -> {
List<Long> list = new ArrayList<Long>(a);
list.addAll(b);
return list;
});