如何从 List<Integer> 获取 IntStream?

How do I get an IntStream from a List<Integer>?

提问人:fredoverflow 提问时间:7/8/2014 最后编辑:Stuart Marksfredoverflow 更新时间:12/21/2018 访问量:29496

问:

我能想到两种方法:

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);
}

什么是惯用方式?也许已经有一个库函数可以完全按照我的意愿做?

Java 集合 java-8 java-stream boxings

评论

0赞 Naman 12/21/2018
另一种可能的方法是flatMapToIntInstream.of 一起使用
0赞 Tom Hawtin - tackline 11/7/2022
使用效率低得令人发指。我想知道这样的事情在生产代码中经常发生。我见过一些奇怪的、不那么令人震惊的拳击-开箱的例子。Integer::valueOf

答:

68赞 gontard 7/8/2014 #1

我想(或者至少它是一种替代方案)这种方式性能更高:

public static IntStream baz(List<Integer> list)
{
    return list.stream().mapToInt(Integer::intValue);
}

因为函数 Integer::intValueToIntFunction 完全兼容,因为它需要一个 并且它返回一个 .不执行自动装箱Integerint

我也在寻找 Function::identity 的等价物,我希望写一个与您的方法等效的方法bar

public static IntStream qux(List<Integer> list)
{
    return list.stream().mapToInt(IntFunction::identity);
}

但他们没有提供这种方法。不知道为什么。identity

评论

3赞 fredoverflow 7/8/2014
哈哈,我混淆了.我建议的函数将列表中的 Integer 拆箱以将其传递到 ,然后将其返回到一个框中,然后再次将其拆箱以放入流:)Integer::valueOfInteger::intValuefoovalueOf
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 函数 - 可以直接使用方法引用。IntegerToIntFunction.applyAsInt(T value)intIntegerTx -> xInteger xintInteger::intValue
7赞 Naman 12/21/2018 #2

另一种转换方法是使用 Stream.flatMapToIntIntStream.of 作为:

public static IntStream foobar(List<Integer> list) {
    return list.stream().flatMapToInt(IntStream::of);
}

注意:在这里发布之前,我经历了几个链接的问题,我也找不到其中的建议。

评论

0赞 Tom Hawtin - tackline 11/7/2022
聪明。即使对于流来说,效率也低得无可救药。但很聪明。