将 Collection<Integer> 转换为 Spliterator.OfInt

1 java java-stream

怎样才能Collection<Integer>转换成Spliterator.OfInt?我尝试了很多方法,但都没有奏效。我可以 :

Collection<Integer> coll = new ArrayList<>();
Spliterator<Integer> ints = coll.spliterator();
Run Code Online (Sandbox Code Playgroud)

但我想要一个Spliterator.OfInt而不是Spliterator<Integer>. 如何做到这一点?

And*_*eas 6

您需要提供拆箱操作,因此可以使用以下方法:

Collection<Integer> coll = ...

Spliterator.OfInt spliterator = coll.stream().mapToInt(Integer::intValue).spliterator();
Run Code Online (Sandbox Code Playgroud)

  • 我个人并不认为这会对性能产生任何重大影响。我的意思是看看上面的代码,它更小。 (4认同)
  • @Somebody我从未声称这更快(运行时性能),只是它生成的代码更少,因为它不必创建隐藏方法。另外,使用“stream()”比使用“StreamSupport”的代码更少,这是另一个问题*正在做的事情,但它已经更新以完成我所做的事情。--- 所以,是的,正如目前的两个答案一样,“i -&gt; i”比“Integer::intValue”要*编写*的代码少(少 11 个字符),但它会导致编译器“生成”更多代码字节码。 (2认同)
  • 有时,值得明确说明将会发生什么。当有一个不应该被分散注意力的实际操作时,自动(取消)装箱是一个很好的工具。但是,当您有一个像“i -&gt; i”这样的 lambda 表达式,其唯一目的是执行隐藏的“intValue()”调用时,读者必须从上下文中确定该调用,即“mapToInt”,一个显式方法引用,如“Integer” ::intValue` 可能更容易阅读。 (2认同)
  • @roundAbout 你把它搞反了。当您看到“i -&gt; i”时,您首先必须环顾四周以识别其上下文是“mapToInt”,以了解它的作用不仅仅是例如“Function”上下文中的“i -&gt; i”是期待。事实上,当需要 `Function` 时,我更喜欢使用 `Function.identity()` 来记录只是传递参数是有意的。如果我们真的谈论这种无关紧要的节省,它将在运行时节省几百个字节,这胜过键入时的几个字符……我希望,您知道 `Integer::intValue` 生成的代码比 `i -&gt; i` 生成的代码少这个上下文 (2认同)