尝试编写一个简单的程序,该程序将在Java8中打印输入数组中的唯一单词。例如,如果输入是

   String[] input = {"This", "is", "This", "not"};


程序应输出[T, h, i, s, n, o, t],元素的顺序应与输入中出现的顺序相同。我的方法是先split输入,然后是mapdistinct,最后是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]

10-06 16:03