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

noo*_*r24 4 java lambda java-8 java-stream flatmap

我试图将我的String []流展平为String Stream

例如

{ "A", "B", "C" }, {"D, "E" } to "A", "B", "C", "D", "E"
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止的代码:

Files.lines(Paths.get(file)).map(a -> a.split(" "));
Run Code Online (Sandbox Code Playgroud)

Files.lines(path)返回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
}
Run Code Online (Sandbox Code Playgroud)

And*_*lko 6

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
Run Code Online (Sandbox Code Playgroud)

一个Stream#flatMap映射器需要一个Stream退还.你回来了String[].要String[]变为a 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));
}
Run Code Online (Sandbox Code Playgroud)