从 Java.util.stream.Stream 中检索列表 8

2022-08-31 04:26:13

我正在玩Java 8 lambdas来轻松过滤集合。但是我没有找到一种简洁的方法将结果作为同一语句中的新列表进行检索。以下是我迄今为止最简洁的方法:

List<Long> sourceLongList = Arrays.asList(1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L);
List<Long> targetLongList = new ArrayList<>();
sourceLongList.stream().filter(l -> l > 100).forEach(targetLongList::add);

网络上的例子没有回答我的问题,因为它们在没有生成新的结果列表的情况下停止了。必须有一种更简洁的方式。我本来以为,该类具有诸如, , ...StreamtoList()toSet()

有没有办法让变量直接由第三行赋值?targetLongList


答案 1

如果您正在执行的操作可能是最简单的方法,前提是您的流保持顺序 , 否则您将不得不在 之前调用 sequential()。forEach

[稍后编辑:调用 sequential() 的原因是,如果流是并行的,则现有的代码 () 将是不规则的。即使这样,它也不会达到预期的效果,因为显然是非确定性的 - 即使在顺序流中,元素处理的顺序也不能保证。您必须使用以确保正确的排序。流 API 设计器的意图是,在这种情况下,您将使用收集器,如下所示。forEach(targetLongList::add)forEachforEachOrdered

另一种选择是

targetLongList = sourceLongList.stream()
    .filter(l -> l > 100)
    .collect(Collectors.toList());

答案 2

更新:

另一种方法是使用:Collectors.toList

targetLongList = 
    sourceLongList.stream().
    filter(l -> l > 100).
    collect(Collectors.toList());

上一个解决方案:

另一种方法是使用:Collectors.toCollection

targetLongList = 
    sourceLongList.stream().
    filter(l -> l > 100).
    collect(Collectors.toCollection(ArrayList::new));