有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将Stream<String[]>转换为Stream<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而不是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
}

共 (1) 个答案

  1. # 1 楼答案

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