如何将 Stream<String[]> 转换为 Stream<String>?

How to convert Stream<String[]> to Stream<String>?

我正在尝试将我的 String[] 流扁平化为 String Stream

例如

{ "A", "B", "C" }, {"D, "E" } to "A", "B", "C", "D", "E"

这是我目前的代码:

Files.lines(Paths.get(file)).map(a -> a.split(" "));

Files.lines(path) returns Stream[String] 然后我用“”分割每个字符串以获得所有单词的数组(所以现在 Stream<String[]>

我想将每个单词数组展平为单独的元素,所以 Stream[String] 而不是 Stream<String[]>

当我使用 flatMap 而不是 map 时出现错误:Type mismatch: cannot convert from String[] to Stream<? extends Object>

我以为flatMap是用来干这个的?完成我想做的事情的最好方法是什么


教授提问:

使用流:编写一个方法根据长度对文件中的单词进行分类:

public static Map<Integer,List<String>> wordsByLength(String file) 
throws IOException {
   // COMPLETE THIS METHOD
}

您传递给 flatMap 的函数必须 return 流,而不是数组。

例如

.flatMap(a -> Arrays.stream(a.split(" ")))
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);

Stream#flatMap 映射器期望返回 Stream。您正在返回 String[]。要将 String[] 转换为 Stream<String>,请使用 Arrays.stream(a.split(" ")).

您作业的完整答案:

public static Map<Integer, List<String>> wordsByLength(String file)
        throws IOException {
    return Files.lines(Paths.get(file))
                .flatMap(a -> Arrays.stream(a.split("\s+")))
                .collect(Collectors.groupingBy(String::length));
}

您需要.flatMap()操作:

  • 正常.map()操作后

    Files.lines(Paths.get(file)).map(a -> a.split(" ")).flatMap(Arrays::stream);
    
  • 结合正常的map操作:

    Files.lines(Paths.get(file)).flatMap(a -> Arrays.stream(a.split(" ")));
    

最后你需要

public static Map<Integer, List<String>> wordsByLength(String file) throws IOException {
    return Files.lines(Paths.get(file))                      //Stream<String>
            .map(a -> a.split(" "))                          //Stream<String[]>
            .flatMap(Arrays::stream)                         //Stream<String>
            .collect(Collectors.groupingBy(String::length)); //Map<Integer, List<String>>
}