Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8从数组中流唯一字符_Java_Arrays_Functional Programming - Fatal编程技术网

Java 8从数组中流唯一字符

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

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

   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);