Java 8从数组中流唯一字符
尝试编写一个简单的程序,在Java8中打印输入数组中的唯一单词。例如,如果输入是Java 8从数组中流唯一字符,java,arrays,functional-programming,Java,Arrays,Functional Programming,尝试编写一个简单的程序,在Java8中打印输入数组中的唯一单词。例如,如果输入是 String[] input = {"This", "is", "This", "not"}; 程序应输出[T,h,i,s,n,o,T],元素顺序应遵循与输入中显示的相同模式。我的方法是split输入,然后map,distinct,最后collectit-toList。但是下面的代码是打印流列表而不是单词,我遗漏了什么 String[] input = {"This", "is", "This", "not
String[] input = {"This", "is", "This", "not"};
程序应输出[T,h,i,s,n,o,T]
,元素顺序应遵循与输入中显示的相同模式。我的方法是split
输入,然后map
,distinct
,最后collect
it-toList。但是下面的代码是打印流列表而不是单词,我遗漏了什么
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中是否有其他方法可以达到同样的效果 您需要使用来映射流的内容。正如您所注意到的,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]
另一个补充@sol4me答案的解决方案:
System.out.println(Stream.of(input).flatMapToInt(CharSequence::chars)
.distinct().mapToObj(c -> Character.valueOf((char) c))
.collect(Collectors.toList()));
可能会以更有效的方式编写
JDK没有定义CharStream,不幸的是…Java在Action 8:中对使用平面图有很好的解释,我重申了前面发布的解决方案,并按照书中的说明进行了解释
String[] input = {"This", "is", "This", "not"};
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");
});
流映射(函数
<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);