noobcoder24:
私は、文字列ストリームに私の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
}
アンドリューTobilko:
<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));
}