【发布时间】:2020-03-05 06:37:53
【问题描述】:
我试图回答这个question,但我没有回答,因为我不太了解 Streams。请告诉我我的解释是否正确。
我的回答:
import java.util.Arrays;
import java.util.stream.Stream;
public class Temp {
public static void main(String [] args){
String [] input = {"1,2", "3,4", "5"};
String [] expected = {"1", "2", "3", "4", "5"};
String [] actual = Stream.of(input)
.flatMap(s -> Arrays.stream(s.split(",")))
.toArray(String [] :: new);
//Testing - Runs only when assertions are enabled for your JVM. Set VM args = -ea for your IDE.
assert Arrays.equals(actual, expected) : "Actual array does not match expected array!";
}
}
我的解释:
1 - 获取一个元素流(本例中为字符串)并一次将一个元素传递给flatMap。
问题 - 这实际上是一次一个元素吗?
2 - flatMap 采用 Function 将元素转换为 Stream。在示例中,该函数接受一个字符串(“1,2”)并将其转换为多个字符串(“1”、“2”)的流。多个字符串的流由 Arrays.stream(an array) 生成,我们知道它接受一个数组并将其转换为流。该数组由s.split(",") 生成。所有其他元素都被处理并放入这个流中。
问题 - flatMap 是为输入数组中的所有元素返回一个流,还是为输入数组的每个元素返回一个流?
3 - toArray 从flatMap 获取的单个流中获取元素并将它们放入一个数组中。
【问题讨论】:
-
(1) 是的。 (2)
Function为原始流中的每个元素返回一个流,允许flatMap返回一个包含所有“扁平化”元素的流。 (3) 太宽泛的问题;要真正了解流的工作原理,我建议查看源代码。 -
试试这个 -
String[] actual = Stream.of(input) .flatMap(s -> Arrays.stream(s.split(","))) .peek(System.out::println) .toArray(String[]::new);然后与String[] actual = Stream.of(input) .peek(System.out::println) .flatMap(s -> Arrays.stream(s.split(","))) .peek(System.out::println) .toArray(String[]::new);比较。它会帮助您自行确认。 -
模糊的标题。重写以总结您的具体技术问题。
-
@Slaw - 我通过删除最后一个问题将问题更新为更具体。
-
虽然流“一次处理一个元素”是正确的,但您无需担心。您已经为每个元素定义了一个操作,处理顺序无关紧要。
标签: java lambda java-stream