如何将 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>>
}
我正在尝试将我的 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>>
}