提问人:fredoverflow 提问时间:7/8/2014 最后编辑:Stuart Marksfredoverflow 更新时间:12/21/2018 访问量:29496
如何从 List<Integer> 获取 IntStream?
How do I get an IntStream from a List<Integer>?
问:
我能想到两种方法:
public static IntStream foo(List<Integer> list)
{
return list.stream().mapToInt(Integer::valueOf);
}
public static IntStream bar(List<Integer> list)
{
return list.stream().mapToInt(x -> x);
}
什么是惯用方式?也许已经有一个库函数可以完全按照我的意愿做?
答:
68赞
gontard
7/8/2014
#1
我想(或者至少它是一种替代方案)这种方式性能更高:
public static IntStream baz(List<Integer> list)
{
return list.stream().mapToInt(Integer::intValue);
}
因为函数 Integer::intValue
与 ToIntFunction
完全兼容,因为它需要一个 并且它返回一个 .不执行自动装箱。Integer
int
我也在寻找 Function::identity 的等价物,我希望写一个与您的方法等效的方法:
bar
public static IntStream qux(List<Integer> list)
{
return list.stream().mapToInt(IntFunction::identity);
}
但他们没有提供这种方法。不知道为什么。identity
评论
3赞
fredoverflow
7/8/2014
哈哈,我混淆了.我建议的函数将列表中的 Integer 拆箱以将其传递到 ,然后将其返回到一个框中,然后再次将其拆箱以放入流:)Integer::valueOf
Integer::intValue
foo
valueOf
1赞
gontard
3/9/2016
@shmosel,因为没有自动装箱intValue
5赞
yshavit
3/9/2016
什么自动装箱?在 lambda 版本中,x 已经是一个整数(来自 List),并且使用 intValue 将 “return x” 隐式_un_boxes为 int。我怀疑差异一开始会不知不觉地很小,到 JIT 完成时会变得更小。
1赞
shmosel
3/9/2016
@yshavit更不用说身份函数也会做同样的事情。
1赞
BeeOnRope
4/18/2017
@VictorZamanian - 那里没有拳击。该值从列表中开始,并传递给 ,后者接受一个对象并返回,因此在调用该对象时没有要转换为的框。然后 lambda 函数接受 an 并返回它,这意味着它被拆箱以符合返回类型。没有进一步的装箱或拆箱。首选的一个合理理由是不会创建额外的 lambda 函数 - 可以直接使用方法引用。Integer
ToIntFunction.applyAsInt(T value)
int
Integer
T
x -> x
Integer x
int
Integer::intValue
7赞
Naman
12/21/2018
#2
另一种转换方法是使用 Stream.flatMapToInt
和 IntStream.of
作为:
public static IntStream foobar(List<Integer> list) {
return list.stream().flatMapToInt(IntStream::of);
}
注意:在这里发布之前,我经历了几个链接的问题,我也找不到其中的建议。
评论
0赞
Tom Hawtin - tackline
11/7/2022
聪明。即使对于流来说,效率也低得无可救药。但很聪明。
上一个:高效整数比较函数
评论
flatMapToInt
与Instream.of
一起使用Integer::valueOf