gpt4 book ai didi

java-8 - 为什么 Stream API 中没有 flatten() 方法?

转载 作者:行者123 更新时间:2023-12-02 08:12:34 27 4
gpt4 key购买 nike

以下两个代码片段产生相同的结果。

使用flatMap:

Stream.iterate(2, n -> n + 4)
.flatMap(n -> Stream.of(n, -(n + 2)));

使用 map 后跟使用 identityflatMap:

Stream.iterate(2, n -> n + 4)
.map(n -> Stream.of(n, -(n + 2)))
.flatMap(Function.identity());

因此,在 Stream 接口(interface)(如 Scala 的 Stream )中包含一个无参数的 flatten 方法似乎很自然,以允许前面的示例写成:

Stream.iterate(2, n -> n + 4)
.map(n -> Stream.of(n, -(n + 2)))
.flatten();

那么为什么Stream API中没有flatten()方法呢?

最佳答案

A flatten方法无法在 Java 中实现。它只能在 Stream<? extends Stream<?>> 上调用但无法确定是否T extends Stream<R>对于某些类型 R .

如果您查看 Scala 中的方法签名:

def flatten[B](implicit asTraversable: (A) ⇒ GenTraversableOnce[B]): Stream[B]

它实际上采用了一个隐含的证据参数,类型 A是某种类型的集合 B .

flatMap Java 中的方法接受一个函数 T -> Stream<? extends R> :

<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)

所以我们知道它可以展平为Stream<R> .

flatten 的静态实现是可能的:

static <R> Stream<R> flatten(Stream<? extends Stream<? extends R>> stream) {
return stream.flatMap(Function.identity());
}

关于java-8 - 为什么 Stream API 中没有 flatten() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45116585/

27 4 0