Dan*_* K. 431 collections lambda java-8 java-stream
我正在玩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);
Run Code Online (Sandbox Code Playgroud)
网上的例子没有回答我的问题,因为他们停止而没有生成新的结果列表.必须有一个更简洁的方式.我本来期望的是,Stream
类有方法为toList()
,toSet()
,...
有没有办法targetLongList
可以直接由第三行分配变量?
Mau*_*lin 595
如果您的流保持顺序,您正在做的事情可能是最简单的方式 - 否则您必须先调用sequential()forEach
.
[稍后编辑:调用sequential()是必要的原因是,forEach(targetLongList::add)
如果流是并行的,代码(如果它)()将会很有效.即便如此,它也不会达到预期的效果,因为forEach
明确是不确定的 - 即使在顺序流中,元素处理的顺序也不能得到保证.您必须使用forEachOrdered
以确保正确的订购.Stream API设计者的目的是在这种情况下使用收集器,如下所示.
另一种选择是
targetLongList = sourceLongList.stream()
.filter(l -> l > 100)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
Moh*_*lla 174
更新:
另一种方法是使用Collectors.toList
:
targetLongList =
sourceLongList.stream().
filter(l -> l > 100).
collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
以前的方案:
另一种方法是使用Collectors.toCollection
:
targetLongList =
sourceLongList.stream().
filter(l -> l > 100).
collect(Collectors.toCollection(ArrayList::new));
Run Code Online (Sandbox Code Playgroud)
Zhe*_*lov 14
Java 16 中有一个新方法Stream.toList(),它将流元素累积到一个不可修改的列表中:
List<Long> targetLongList = sourceLongList
.stream()
.filter(l -> l > 100)
.toList();
Run Code Online (Sandbox Code Playgroud)
Lii*_*Lii 12
我喜欢使用一个util方法,它返回一个收集器,ArrayList
当我想要的时候.
我认为使用的解决方案Collectors.toCollection(ArrayList::new)
对于这种常见操作来说有点过于嘈杂.
例:
ArrayList<Long> result = sourceLongList.stream()
.filter(l -> l > 100)
.collect(toArrayList());
public static <T> Collector<T, ?, ArrayList<T>> toArrayList() {
return Collectors.toCollection(ArrayList::new);
}
Run Code Online (Sandbox Code Playgroud)
通过这个答案,我还想证明创建和使用自定义收集器是多么简单,这通常非常有用.
collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
这是您可以用来将任何流转换为列表的调用。
更具体地说:
List<String> myList = stream.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
从:
https://www.geeksforgeeks.org/collectors-tolist-method-in-java-with-examples/
如果您有一个基元数组,则可以使用Eclipse Collections中提供的基元集合.
LongList sourceLongList = LongLists.mutable.of(1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L);
LongList targetLongList = sourceLongList.select(l -> l > 100);
Run Code Online (Sandbox Code Playgroud)
如果您无法更改sourceLongList List
:
List<Long> sourceLongList = Arrays.asList(1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L);
List<Long> targetLongList =
ListAdapter.adapt(sourceLongList).select(l -> l > 100, new ArrayList<>());
Run Code Online (Sandbox Code Playgroud)
如果你想使用LongStream
:
long[] sourceLongs = new long[]{1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L};
LongList targetList =
LongStream.of(sourceLongs)
.filter(l -> l > 100)
.collect(LongArrayList::new, LongArrayList::add, LongArrayList::addAll);
Run Code Online (Sandbox Code Playgroud)
注意:我是Eclipse Collections的贡献者.
一种更有效的方法(避免创建源列表和过滤器的自动拆箱):
List<Long> targetLongList = LongStream.of(1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L)
.filter(l -> l > 100)
.boxed()
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
314437 次 |
最近记录: |