Java flatMap - 有什么区别stream.of()和collection.stream()

时间:2016-04-24 12:05:50

标签: java java-8 java-stream flatmap

我试图了解2.6flatMap不会使流平展,而flatMap(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));
    }

}

2 个答案:

答案 0 :(得分:7)

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

另一方面,x.stream()其中xCollection<E>会返回Stream<E>,其来源是Collection的元素,因此在您的情况下它返回Stream<String>,这允许flatMap生成Stream<String>,其中包含来源String的所有List<String>中的所有Stream<T> Stream<T> java.util.stream.Stream.of(T t)

你可以在Javadoc中看到:

  

Stream<E> stream()
  返回包含单个元素的顺序Stream

VS

  

1 Jan 2001
  返回以此集合为源的顺序Stream

答案 1 :(得分: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()有两种形式:

因为,在将List传递给Stream.of()时,唯一适用的重载是获取单个值的重载,您得到的是Stream<List<String>>而不是预期的Stream<String> < / p>