为什么没有IntStream.flatMapToObj()?

shm*_*sel 11 java java-8 java-stream

我正在尝试做这样的事情:

Stream<Object> stream = IntStream.of(...)
        .flatMapToObj(i -> getStreamOfObjects(i));
Run Code Online (Sandbox Code Playgroud)

不幸的是,IntStream.flatMapToObj()即使在Java 9中也不存在.

  1. 为什么遗漏了?
  2. 什么是推荐的解决方法?

Sto*_*ica 13

为什么被遗漏了?

API提供可重用的构建块.这里的相关积木是IntStream,mapToObj,flatMap.通过这些,您可以实现您想要的效果:将流映射到对象,然后获得平面地图.提供构建块的排列是不实际的,并且难以扩展.

什么是推荐的解决方法?

如前所述,使用可用的构建块(mapToObj+ flatMap):

Stream<Object> stream = IntStream.of(...)
    .mapToObj(i -> Stream.of(...))
    .flatMap(...);
Run Code Online (Sandbox Code Playgroud)

  • 这个`.flatMap(...)`应该是`.flatMap(Function.identity())`因为你已经用mapToObj映射到了Streams (5认同)
  • 好答案.我想我下意识地假设`IntStream.flatMapToObj()`与`Stream.flatMapToInt()`一样必要,但显然不是这样. (2认同)
  • 我不太相信这一点 - 在 API 中,我们提供了 `.boxed()` 方法,它应该消除对 `.mapToObj(...)` 的需要,因为所有内容都可以重写为 `.boxed( ).map(...)`。因此,提供`.mapToObj()`(`.boxed().map(...)`)而不是`.flatMapToObj()`(`.boxed().flatMap()`)似乎不一致。 (2认同)

Lou*_*man 8

写吧

 IntStream.of(...).mapToObj(i -> getStreamOfObjects(i)).flatMap(stream -> stream)
Run Code Online (Sandbox Code Playgroud)


pru*_*nge 8

如果你不介意装箱每个int值的成本,使用盒装流将有效.

Stream<Object> stream = IntStream.of(...).boxed().flatMap(i -> getStreamOfObjects(i));
Run Code Online (Sandbox Code Playgroud)