4

我试图理解flatMapflatMap(x->stream.of(x) )不会使流变平并且flatMap(x->x.stream())可以工作并给出所需的结果。有人可以解释两者之间的区别吗?

import java.util.*;
import java.util.stream.*;

class TestFlatMap{

    public static void main(String args[]){
        List<String> l1 = Arrays.asList("a","b");
        List<String> l2 = Arrays.asList("c","d");

        Stream.of(l1, l2).flatMap((x)->Stream.of(x)).forEach((x)->System.out.println(x));

        Stream.of(l1, l2).flatMap((x)->x.stream()).forEach((x)->System.out.println(x));
    }

}

输出 :

[a, b]
[c, d]
a
b
c
d
4

2 回答 2

7

Stream.of(x)生成单个元素的 Stream - x。因此,flatMap返回 aStream<List<String>>而不是Stream<String>

另一方面,x.stream()where xis aCollection<E>返回 a Stream<E>,其源是 的元素Collection,因此在您的情况下,它返回 a Stream<String>,这允许flatMap生成Stream<String>包含source 的所有Strings 中的所有s 的 a 。List<String>Stream

您可以在 Javadoc 中看到:

<T> Stream<T> java.util.stream.Stream.of(T t)
返回包含单个元素 的顺序 Stream 。

对比

Stream<E> stream()
返回以此集合为源 的顺序流。

于 2016-04-24T12:08:47.777 回答
5

你想到的是这样的:

Stream.of(l1, l2)
      // String[]::new isn't really needed in this simple example,
      // but would be in a more complex one...
      .flatMap((x)->Stream.of(x.toArray(String[]::new)))
      .forEach((x)->System.out.println(x));

这也会产生a, b, c, d如您预期的扁平流。Stream.of()有两种口味:

因为,当将 a 传递List给 时Stream.of(),唯一适用的重载是采用单个值的重载,因此您得到的是 aStream<List<String>>而不是预期的Stream<String>

于 2016-04-24T13:06:26.950 回答