授業がある
class Foo{
String name;
// setter, getter
}
デフォルトのコンストラクタだけがあります。
Foo
次に、ある文字列からリストを作成しようとしています。
Arrays.stream(fooString.split(","))
.map(name -> {
Foo x = new Foo();
x.setName(name);
return x;
}).collect(Collectors.toList()));
名前を取るコンストラクタがないので、単純にメソッド参照を使用することはできません。もちろん、コンストラクタ呼び出しとセッターを含む 3 行をメソッドに抽出することはできますが、それを実行するより良い方法や簡潔な方法はありますか? (Foo
生成されたファイルである を変更せずに)
ベストアンサー1
これが繰り返し発生する場合は、1 つのプロパティ値を指定してオブジェクトを構築する問題を処理する汎用ユーティリティ メソッドを作成できます。
public static <T,V> Function<V,T> create(
Supplier<? extends T> constructor, BiConsumer<? super T, ? super V> setter) {
return v -> {
T t=constructor.get();
setter.accept(t, v);
return t;
};
}
次のように使用できます:
List<Foo> l = Arrays.stream(fooString.split(","))
.map(create(Foo::new, Foo::setName)).collect(Collectors.toList());
Foo
これは、次のものやそのsetName
方法に固有のものではないことに注意してください。
List<List<String>> l = Arrays.stream(fooString.split(","))
.map(create(ArrayList<String>::new, List::add)).collect(Collectors.toList());
ちなみに、 が非常に大きくなったり、(分割後に)多くの要素が含まれる可能性がある場合は、の代わりにfooString
を使用する方が効率的かもしれません。Pattern.compile(",").splitAsStream(fooString)
Arrays.stream(fooString.split(","))