Java 转换集合<;整数>;分路器

Java 转换集合<;整数>;分路器,java,java-stream,Java,Java Stream,如何将Collection转换为Spliterator.ofit?我试过很多方法,但都没有成功。我可以做到: Collection<Integer> coll = new ArrayList<>(); Spliterator<Integer> ints = coll.spliterator(); Collection coll=new ArrayList(); Spliterator ints=coll.Spliterator(); 但是我想要一个拆分器。

如何将
Collection
转换为
Spliterator.ofit
?我试过很多方法,但都没有成功。我可以做到:

Collection<Integer> coll = new ArrayList<>();
Spliterator<Integer> ints = coll.spliterator();
Collection coll=new ArrayList();
Spliterator ints=coll.Spliterator();
但是我想要一个
拆分器。OFIT
而不是
拆分器。如何实现这一点?

您可以从
.Stream()
获取
,然后
mapToInt
获取
IntStream
,最后调用
spliterator
获取
spliterator.ofit

Spliterator.OfInt ofInt = coll.stream().mapToInt(i -> i).spliterator();
您可以从
.Stream()
获取
Stream
,然后
mapToInt
获取
IntStream
,最后调用
spliterator
获取
spliterator.ofit

Spliterator.OfInt ofInt = coll.stream().mapToInt(i -> i).spliterator();

您需要提供取消装箱操作,这样类似的操作就可以了:

集合coll=。。。
Spliterator.OfInt Spliterator=coll.stream().mapToInt(Integer::intValue.Spliterator();

您需要提供取消装箱操作,这样类似的操作就可以了:

集合coll=。。。
Spliterator.OfInt Spliterator=coll.stream().mapToInt(Integer::intValue.Spliterator();

我个人认为这不会对性能产生任何重大影响。我的意思是看上面的代码,它更小。@我从来没有说过这更快(运行时性能),只是它生成的代码更少,因为它不必创建隐藏方法。另外,使用
stream()
比使用
StreamSupport
的代码要少,这也是另一个问题所做的,但它已经更新为我所做的。--因此,是的,正如目前的两个答案一样,
i->i
Integer::intValue
(少11个字符)编写的代码要少,但它会导致编译器生成更多字节码。有时,值得明确说明会发生什么。当有一个不应该分散注意力的实际操作时,自动(取消)装箱是一个很好的工具。但是,如果有一个lambda表达式,如
i->i
,其唯一目的是执行隐藏的
intValue()
调用,读者必须从上下文中确定该调用,即
mapToInt
,那么像
Integer::intValue
这样的显式方法引用可能更容易阅读。你的评论对我来说没有意义。当您在
流上执行
mapToInt
时,这意味着这将是一个取消装箱操作,因为除了
int
@Holger之外,您不能返回任何内容,所以
i->i
Integer::intValue
更好,因为
i->i
使用的字符更少
11
。为什么要担心
11个
字符?因为人们担心:只是它生成的代码更少;)@你把它倒过来了。当您看到
i->i
时,您首先必须环顾四周,认识到其上下文是
mapToInt
,以了解它所做的不仅仅是
i->i
,例如,在需要
函数的上下文中。事实上,当需要
函数时,我更喜欢使用
Function.identity()
来记录仅仅传递参数是有意的。它在运行时会节省几百个字节,这比打字时节省的几个字符还要多,如果我们真的要谈论这种不相关的节省…我希望,你知道在这种情况下,
Integer::intValue
生成的代码比
I->I
生成的代码少。我个人不觉得这会对性能产生任何重大影响。我的意思是看上面的代码,它更小。@我从来没有说过这更快(运行时性能),只是它生成的代码更少,因为它不必创建隐藏方法。另外,使用
stream()
比使用
StreamSupport
的代码要少,这也是另一个问题所做的,但它已经更新为我所做的。--因此,是的,正如目前的两个答案一样,
i->i
Integer::intValue
(少11个字符)编写的代码要少,但它会导致编译器生成更多字节码。有时,值得明确说明会发生什么。当有一个不应该分散注意力的实际操作时,自动(取消)装箱是一个很好的工具。但是,如果有一个lambda表达式,如
i->i
,其唯一目的是执行隐藏的
intValue()
调用,读者必须从上下文中确定该调用,即
mapToInt
,那么像
Integer::intValue
这样的显式方法引用可能更容易阅读。你的评论对我来说没有意义。当您在
流上执行
mapToInt
时,这意味着这将是一个取消装箱操作,因为除了
int
@Holger之外,您不能返回任何内容,所以
i->i
Integer::intValue
更好,因为
i->i
使用的字符更少
11
。为什么要担心
11个
字符?因为人们担心:只是它生成的代码更少;)@你把它倒过来了。当您看到
i->i
时,您首先必须环顾四周,认识到其上下文是
mapToInt
,以了解它所做的不仅仅是
i->i
,例如,在需要
函数的上下文中。事实上,当需要
函数时,我更喜欢使用
Function.identity()
来记录仅仅传递参数是有意的。它在运行时会节省几百个字节,这超过了键入时的几个字符,如果我们真的讨论这些无关的节省…我希望,您知道在这种情况下,
Integer::intValue
生成的代码比
I->I
生成的代码要少