Java 8 - stream.map() でのコンストラクタ呼び出しとセッターの連鎖 質問する

Java 8 - stream.map() でのコンストラクタ呼び出しとセッターの連鎖 質問する

授業がある

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(","))

おすすめ記事