このように Stream::flatMap を使用できると思っていました
public static List<String> duplicate(String s) {
List<String> l = new ArrayList<String>();
l.add(s);
l.add(s);
return l;
}
listOfStrings.stream().flatMap(str -> duplicate(str)).collect(Collectors.toList());
しかし、次のコンパイラエラーが発生します
Test.java:25: エラー: 互換性のない型: 型変数を推論できません R listOfStrings.stream().flatMap(str -> duplicate(str)).collect(Collectors.toList());
(引数の不一致。ラムダ式 List の不正な戻り値の型は Stream に変換できません)
ここで、R、T は型変数です: R は、メソッド flatMap(Function>) で宣言されたオブジェクトを拡張します。 T は、インターフェイス Stream で宣言されたオブジェクトを拡張します。
scalaでは、私が同等だと信じていることを行うことができます
scala> List(1,2,3).flatMap(duplicate(_))
res0: List[Int] = List(1, 1, 2, 2, 3, 3)
なぜこれが Java での flatMap の有効な使用法ではないのですか?