ada*_*ubi 0 java arrays functional-programming
尝试编写一个简单的程序,它将在Java8中打印输入数组中的唯一单词.例如,如果输入是
String[] input = {"This", "is", "This", "not"};
Run Code Online (Sandbox Code Playgroud)
程序应输出[T, h, i, s, n, o, t],元素的顺序应遵循它们在输入中出现的相同模式.我的方法是split输入,然后map,distinct最后collect是toList.但是下面的代码是打印流而不是单词列表,我缺少什么?.Eg
String[] input = {"This", "is", "This", "not"};
System.out.println(Arrays.stream(input)
.map(word -> word.split(""))
.map(Arrays::stream)
.distinct()
.collect(toList()));
Run Code Online (Sandbox Code Playgroud)
电流输出
[java.util.stream.ReferencePipeline$Head@548c4f57, java.util.stream.ReferencePipeline$Head@1218025c, java.util.stream.ReferencePipeline$Head@816f27d, java.util.stream.ReferencePipeline$Head@87aac27]
Run Code Online (Sandbox Code Playgroud)
我很想知道Java8中是否还有其他方法可以实现相同的目标.
您需要使用flatMap才能映射流的内容.正如您所注意到的那样,Arrays::stream生成单独的流以及您想要的是将所有这些流展平为单个流Eg
System.out.println(Stream.of(input)
.map(w -> w.split(""))
.flatMap(Arrays::stream)
.distinct()
.collect(Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)
产量
[T, h, i, s, n, o, t]
Run Code Online (Sandbox Code Playgroud)
Java in Action 8:对使用平面地图有很好的解释,我重申之前发布的解决方案并按照书本给出解释。
String[] input = {"This", "is", "This", "not"};
Run Code Online (Sandbox Code Playgroud)
map 函数返回一个流,其中包含将给定函数应用于该流的元素的结果。
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
List<Stream<String>> steramsOfStream = Arrays.stream(input)
.map(word -> word.split(""))
.map(Arrays::stream)
.distinct().collect(Collectors.toList());
steramsOfStream.forEach(a -> {
a.forEach(System.out::print);
System.out.print("\n");
});
Run Code Online (Sandbox Code Playgroud)
这将产生以下输出
输出:[这,是,这,不是]
flat map 返回一个流,该流由以下结果组成: " 将此流的每个元素替换为通过将提供的映射函数应用于每个元素而生成的映射流的内容。
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
List<String> listOfStringss = Arrays.stream(input)
.map(word -> word.split(""))
.flatMap(Arrays::stream)
.distinct().collect(Collectors.toList());
System.out.println(listOfStringss);
Run Code Online (Sandbox Code Playgroud)
产生输出:[T, h, i, s, n, o, t] [
] 2