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

时间:2018-12-15 22:39:01

标签: java lambda java-8 java-stream flatmap

我正在尝试将String []流展平为String流

例如

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

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

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

Files.lines(path)返回Stream[String],我将每个字符串除以“”,得到所有单词的数组(所以现在是Stream<String[]>

我想将每个单词数组展平为单个元素,所以用Stream[String]代替Stream<String[]>

当我使用flatMap而不是地图时,出现错误: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
}

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

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

例如

.flatMap(a -> Arrays.stream(a.split(" ")))

答案 2 :(得分:0)

您需要进行.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>>
}