尝试编写一个简单的程序,该程序将在Java8中打印输入数组中的唯一单词。例如,如果输入是
String[] input = {"This", "is", "This", "not"};
程序应输出
[T, h, i, s, n, o, t]
,元素的顺序应与输入中出现的顺序相同。我的方法是先split
输入,然后是map
,distinct
,最后是collect
到列表。但是下面的代码是打印流列表而不是单词,我想念什么?String[] input = {"This", "is", "This", "not"};
System.out.println(Arrays.stream(input)
.map(word -> word.split(""))
.map(Arrays::stream)
.distinct()
.collect(toList()));
电流输出
[java.util.stream.ReferencePipeline$Head@548c4f57, java.util.stream.ReferencePipeline$Head@1218025c, java.util.stream.ReferencePipeline$Head@816f27d, java.util.stream.ReferencePipeline$Head@87aac27]
我很想看看Java8中是否还有其他方法可以达到相同的目的。
最佳答案
您需要使用flatMap来映射流的内容。如您所见,Arrays::stream
生成单独的流,而您想要的是将所有这些流展平为单个流,例如
System.out.println(Stream.of(input)
.map(w -> w.split(""))
.flatMap(Arrays::stream)
.distinct()
.collect(Collectors.toList()));
输出量
[T, h, i, s, n, o, t]