Java flatMap - stream.of() 和 collection.stream() 有什么区别
Java flatMap - whats the difference stream.of() and collection.stream()
我正在尝试了解 flatMap
: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));
}
}
输出:
[a, b]
[c, d]
a
b
c
d
Stream.of(x)
生成单个元素的 Stream - x
。因此,flatMap
returns一个Stream<List<String>>
而不是Stream<String>
.
另一方面,x.stream()
其中 x
是一个 Collection<E>
returns 一个 Stream<E>
其源是 [=19= 的元素],因此在您的情况下,它 returns 一个 Stream<String>
,它允许 flatMap
生成一个包含所有 List<String>
中的所有 String
的 Stream<String>
来源 Stream
.
您可以在 Javadoc 中看到:
<T> Stream<T> java.util.stream.Stream.of(T t)
Returns a sequential Stream containing a single element.
对比
Stream<E> stream()
Returns a sequential Stream with this collection as its source.
你想到的是这个:
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()
有两种形式:
Stream.of(T)
taking a single value as explained also by
Stream.of(T...)
采用 数组 (不是您预期的 List
)
因为,当将 List
传递给 Stream.of()
时,唯一适用的重载是采用单个值的重载,您得到的是 Stream<List<String>>
而不是预期的 Stream<String>
我正在尝试了解 flatMap
: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));
}
}
输出:
[a, b]
[c, d]
a
b
c
d
Stream.of(x)
生成单个元素的 Stream - x
。因此,flatMap
returns一个Stream<List<String>>
而不是Stream<String>
.
另一方面,x.stream()
其中 x
是一个 Collection<E>
returns 一个 Stream<E>
其源是 [=19= 的元素],因此在您的情况下,它 returns 一个 Stream<String>
,它允许 flatMap
生成一个包含所有 List<String>
中的所有 String
的 Stream<String>
来源 Stream
.
您可以在 Javadoc 中看到:
<T> Stream<T> java.util.stream.Stream.of(T t)
Returns a sequential Stream containing a single element.
对比
Stream<E> stream()
Returns a sequential Stream with this collection as its source.
你想到的是这个:
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()
有两种形式:
Stream.of(T)
taking a single value as explained also byStream.of(T...)
采用 数组 (不是您预期的List
)
因为,当将 List
传递给 Stream.of()
时,唯一适用的重载是采用单个值的重载,您得到的是 Stream<List<String>>
而不是预期的 Stream<String>