如何将 Java 8 IntStream 转换为列表?
Posted
技术标签:
【中文标题】如何将 Java 8 IntStream 转换为列表?【英文标题】:How do I convert a Java 8 IntStream to a List? 【发布时间】:2014-07-03 16:29:50 【问题描述】:我正在查看IntStream
的文档,我看到了toArray
方法,但无法直接转到List<Integer>
肯定有办法将Stream
转换为List
?
【问题讨论】:
试试这个链接:***.com/questions/14830313/… @KarlRichter 另一个问题没有给你一个打字列表。此外,这个问题是四年前的问题,并且有 300 多个赞成票的答案。为什么我们现在要合并它? 【参考方案1】:IntStream::boxed
IntStream::boxed
将IntStream
转换为Stream<Integer>
,然后您可以将collect
转换为List
:
theIntStream.boxed().collect(Collectors.toList())
boxed
方法将IntStream
的int
原始值转换为Integer
对象流。单词"boxing" 命名int
⬌ Integer
转换过程。见Oracle Tutorial。
Java 16 及更高版本
Java 16 带来了更短的 toList
方法。产生一个unmodifiable list。讨论here。
theIntStream.boxed().toList()
【讨论】:
@skiwi 我的意思是,在这个答案之后不需要所有其他答案,因为它们不会那么自然。 谢谢我还没有看到盒装方法,它就像一个魅力。 补充:如果您使用toList
的静态导入,我认为这段代码会变得更短、更清晰、更漂亮。这是通过在文件的导入中放置以下内容来完成的:static import java.util.stream.Collectors.toList;
。然后对方付费电话读取为.collect(toList())
。
在 Eclipse 中,可以让 IDE 为方法添加静态导入。这是通过在 Preferences -> Java -> Editor -> Content Assist 中添加 Collectors
类来完成的-> 收藏夹。之后,您只需在 Ctr+Space 处键入 toLi
即可让 IDE 填写 toList
并添加静态导入。
对于我所尝试的方法出了什么问题,我大发雷霆,感谢您指出boxed()
部分【参考方案2】:
您可以使用Eclipse Collections 中提供的原始集合并避免装箱。
MutableIntList list =
IntStream.range(1, 5)
.collect(IntArrayList::new, MutableIntList::add, MutableIntList::addAll);
注意:我是 Eclipse Collections 的贡献者。
【讨论】:
虽然 Eclipse Collections 通常很有帮助,但这看起来并没有让任何事情变得更容易:) 从 EC 9.0 开始,您可以从原始流构建原始列表。MutableIntList list = IntLists.mutable.withAll(IntStream.range(1, 5))
这就是我要找的.. 将 int 流装箱到整数或对象是不同的事情【参考方案3】:
您还可以在 Stream 上使用 mapToObj(),它接受一个 IntFunction 并返回一个对象值 Stream,该 Stream 包含将给定函数应用于该流的元素的结果。
List<Integer> intList = myIntStream.mapToObj(i->i).collect(Collectors.toList());
【讨论】:
讽刺的是,这就是boxed()
的委托。【参考方案4】:
查找以下使用 Java 8 查找每个 int 元素的平方的示例:-
IntStream ints = Arrays.stream(new int[] 1,2,3,4,5);
List<Integer> intsList = ints.map(x-> x*x)
.collect(ArrayList<Integer>::new, ArrayList::add, ArrayList::addAll);
【讨论】:
【参考方案5】:你可以使用collect方法:
IntStream.of(1, 2, 3).collect(ArrayList::new, List::add, List::addAll);
事实上,当您在对象流上调用 .collect(Collectors.toList()) 时,这几乎正是 Java 所做的:
public static <T> Collector<T, ?, List<T>> toList()
return new Collectors.CollectorImpl(ArrayList::new, List::add, (var0, var1) ->
var0.addAll(var1);
return var0;
, CH_ID);
注意:第三个参数只有在你想运行并行收集时才需要;对于顺序收集,只提供前两个就足够了。
【讨论】:
最后一句话说明了一切。以上是关于如何将 Java 8 IntStream 转换为列表?的主要内容,如果未能解决你的问题,请参考以下文章
Java 8 将 int[][] 转换为 Integer[][] 的方法