如何从 List<Integer> 中获取 IntStream?
Posted
技术标签:
【中文标题】如何从 List<Integer> 中获取 IntStream?【英文标题】:How do I get an IntStream from a List<Integer>? 【发布时间】:2014-08-29 07:29:24 【问题描述】:我可以想到两种方法:
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);
什么是惯用的方式?也许已经有一个库函数可以完全满足我的要求?
【问题讨论】:
另一种可能的方式是useflatMapToInt
along with Instream.of
【参考方案1】:
我猜(或者至少是另一种选择)这种方式性能更高:
public static IntStream baz(List<Integer> list)
return list.stream().mapToInt(Integer::intValue);
因为函数Integer::intValue
与ToIntFunction
完全兼容,因为它接受Integer
并返回int
。没有执行autoboxing。
我也在寻找Function::identity
的等价物,我希望写一个等价于你的bar
方法:
public static IntStream qux(List<Integer> list)
return list.stream().mapToInt(IntFunction::identity);
但他们没有提供这种identity
方法。不知道为什么。
【讨论】:
大声笑,我把Integer::valueOf
和Integer::intValue
混淆了。我建议的函数foo
将列表中的整数拆箱以将其传递给valueOf
,然后将其返回到一个框中,然后将其拆箱再次放入流中:)
@shmosel 因为intValue
没有自动装箱
什么自动装箱?在 lambda 版本中,x 已经是一个整数(来自列表),并且“返回 x”使用 intValue 将其隐式_un_boxes _un_boxes。我怀疑这种差异一开始会非常小,到 JIT 完成后会变得更小。
@yshavit 更不用说恒等函数也会做同样的事情。
@VictorZamanian - 那里没有拳击。该值在列表中以Integer
开头,然后传递给ToIntFunction.applyAsInt(T value)
,它接受一个对象并返回int
,因此在调用它时没有将Integer
转换为T
的装箱。然后 lambda 函数 x -> x
接受 Integer x
并返回它,这意味着它被取消装箱以符合 int
返回类型。没有进一步的装箱或拆箱。更喜欢Integer::intValue
的一个正当理由是没有创建额外的 lambda 函数 - 可以直接使用方法引用。【参考方案2】:
另一种转换方式是使用Stream.flatMapToInt
和IntStream.of
作为:
public static IntStream foobar(List<Integer> list)
return list.stream().flatMapToInt(IntStream::of);
注意:在此处发布之前,我浏览了几个链接的问题,但我也找不到其中的建议。
【讨论】:
以上是关于如何从 List<Integer> 中获取 IntStream?的主要内容,如果未能解决你的问题,请参考以下文章
有A和B两个顺序表,数据都为从小到大排列,如何把它们合并从一个顺序表C