web-dev-qa-db-ja.com

Java 8チェーンメソッドリファレンス?

典型的な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())::addmyBean::getList::addなどの連鎖メソッド参照に置き換える方法はありますか?

19
m3th0dman

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


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

_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);
}
_

_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);
_
11
Holger