【问题标题】:Java 8 Stream unique characters from arrayJava 8从数组中流式传输唯一字符
【发布时间】:2023-03-18 20:02:02
【问题描述】:

尝试编写一个简单的程序,该程序将打印 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 中是否还有其他方法可以实现相同的目标。

【问题讨论】:

    标签: java arrays functional-programming


    【解决方案1】:

    您需要使用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]
    

    【讨论】:

      【解决方案2】:

      补充@sol4me 答案的另一种解决方案:

      System.out.println(Stream.of(input).flatMapToInt(CharSequence::chars)
          .distinct().mapToObj(c -> Character.valueOf((char) c))
          .collect(Collectors.toList()));
      

      可能会以更有效的方式编写。

      不幸的是,JDK 没有定义CharStream...

      【讨论】:

        【解决方案3】:

        Java in 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");
                });
        

        这将产生以下输出

        输出: [这,是,这,不是]

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

        产生输出: [T, h, i, s, n, o, t] []2

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-09
          • 1970-01-01
          • 2020-07-30
          • 1970-01-01
          • 2018-06-25
          • 2017-03-12
          相关资源
          最近更新 更多