任何人都可以解释一下吗,我正在尝试通过平面地图实现交叉连接?

问题描述 投票:0回答:1
List<Integer> s1 = Stream.of(1, 2);
Supplier<Stream<String>> s2 = ()->Stream.of("A", "B");

s1.flatMap(v1 -> s2.get()
                   .map(v2 ->tuple(v1,v2))).forEach(System.out::println);

Flatmap 参数需要澄清。

java java-stream
1个回答
0
投票

首先,第一行有一个拼写错误,其中

Stream.of
被分配给
List<Integer>

关于

flatMap
论证的解释:

  • 来自

    s1
    流的每个整数都被映射到包含多个项目的
    Stream<tuple>
    :对于每个整数,从
    Stream<String>

    中选取一个字符串
  • 因此,这些多个

    Stream<tuple>
    应该被展平成单个
    Stream<tuple>
    ,然后在
    forEach
    终端操作中被消耗

List<Integer> s1 = Stream.of(1, 2);
Supplier<Stream<String>> s2 = () -> Stream.of("A", "B");

s1  // Stream<Integer>
.flatMap(v1 -> s2.get() // Stream<String> returned by the Supplier
                 .map(v2 -> tuple(v1,v2)) // Stream<tuple>
) // Stream<tuple>
.forEach(System.out::println);

为了便于说明,我们假设仅使用

map
代替
flatMap
(也使用
List
代替
tuple
):

s1  // Stream<Integer>
    .map(v1 -> s2.get() // Stream<String> returned by the Supplier
        .map(v2 -> Arrays.asList(v1, v2)) // Stream<List>
    ) // Stream<Stream<List>>
    .peek(System.out::println)
    .flatMap(s -> s) Stream<List>
    .forEach(System.out::println);

输出:

java.util.stream.ReferencePipeline$3@3dd4520b // printed by peek
[1, A]
[1, B]
java.util.stream.ReferencePipeline$3@5ae63ade // printed by peek
[2, A]
[2, B]
© www.soinside.com 2019 - 2024. All rights reserved.