Java 为什么不是';有IntStream.flatMapToObj()吗?
我正在尝试这样做:Java 为什么不是';有IntStream.flatMapToObj()吗?,java,java-8,java-stream,Java,Java 8,Java Stream,我正在尝试这样做: Stream<Object> stream = IntStream.of(...) .flatMapToObj(i -> getStreamOfObjects(i)); Stream=IntStream.of(…) .flatMapToObj(i->getStreamOfObjects(i)); 不幸的是,IntStream.flatMapToObj()甚至在Java9中也不存在 为什么它被遗漏了 推荐的解决方法是什么 只要写 IntS
Stream<Object> stream = IntStream.of(...)
.flatMapToObj(i -> getStreamOfObjects(i));
Stream=IntStream.of(…)
.flatMapToObj(i->getStreamOfObjects(i));
不幸的是,IntStream.flatMapToObj()
甚至在Java9中也不存在
IntStream.of(...).mapToObj(i -> getStreamOfObjects(i)).flatMap(stream -> stream)
如果您不介意装箱每个
int
值的成本,那么使用装箱流是可行的
Stream<Object> stream = IntStream.of(...).boxed().flatMap(i -> getStreamOfObjects(i));
Stream=IntStream.of(…).boxed().flatMap(i->getStreamOfObjects(i));
为什么它被遗漏了
API提供了可重用的构建块。这里的相关构建块是IntStream
,mapToObj
,flatMap
。通过这些,您可以实现您想要的:将流中的对象映射到对象,然后获得平面贴图。提供构建块的排列是不现实的,而且更难扩展
推荐的解决方法是什么
如前所述,使用可用的构建块(mapToObj
+flatMap
):
Stream=IntStream.of(…)
.mapToObj(i->Stream.of(…))
.flatMap(…);
回答得好。我想我下意识地认为IntStream.flatMapToObj()
和Stream.flatMapToInt()
一样必要,但事实显然不是这样。这个.flatMap(…)
应该是.flatMap(Function.identity())
由于您已经使用mapToObj映射到流,我对此并不确信-在API中,我们提供了.boxed()
方法,这应该消除了对.mapToObj(…)
的需要,因为所有这些都可以重写为.boxed().map(…)
。因此,提供.mapToObj()。在本例中,如果有一个函数返回原语int
的流,则装箱int
将是一种浪费,甚至可能导致性能问题。换句话说,mapToObj
是必要的,因为Java中的原语类型。(悲伤和丑陋,但却是真的。)是的,是的,我没有想到装箱的成本:)正如注意的那样,您可以使用Function.identity()
而不是stream->stream
Stream<Object> stream = IntStream.of(...)
.mapToObj(i -> Stream.of(...))
.flatMap(...);