31

典型的な Java Bean があるとします。

class MyBean {
    void setA(String id) {
    }

    void setB(String id) { 
    }

    List<String> getList() {
    }
}

そして、BiConsumer の助けを借りて、セッターを呼び出すより抽象的な方法を作成したいと思います。

Map<SomeEnum, BiConsumer<MyBean, String>> map = ...
map.put(SomeEnum.A, MyBean::setA);
map.put(SomeEnum.B, MyBean::setB);
map.put(SomeEnum.List, (myBean, id) -> myBean.getList().add(id));

(myBean, id) -> myBean.getList().add(id)ラムダをチェーンされたメソッド参照、(myBean.getList())::addまたはmyBean::getList::add何か他のものに置き換える方法はありますか?

4

1 に答える 1

22

いいえ、メソッド参照は連鎖をサポートしていません。あなたの例では、2 つのメソッドのどちらが 2 番目のパラメーターを受け取るべきかは明確ではありません。


しかし、あなたがそれを主張するなら…</p>

static <V,T,U> BiConsumer<V,U> filterFirstArg(BiConsumer<T,U> c, Function<V,T> f) {
    return (t,u)->c.accept(f.apply(t), u);
}

…</p>

BiConsumer<MyBean, String> c = filterFirstArg(List::add, MyBean::getList);

BiConsumerメソッドの命名は、既存の(ここでは) を取得し、最初の引数にList.add関数 (ここでは ) を追加するものとして表示することを示唆しています。MyBean.getList()2 番目の引数または両方を同時にフィルター処理する同等のユーティリティ メソッドがどのように見えるかは容易に想像できます。

ただし、主に既存の実装を別の操作と組み合わせる場合に役立ちます。あなたの特定の例では、使用サイトは通常のラムダ式よりも優れていません

BiConsumer<MyBean, String> c = (myBean, id) -> myBean.getList().add(id);
于 2015-03-19T14:07:58.040 に答える