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

Есть ли способ заменить lambda (myBean, id) -> myBean.getList().add(id) ссылкой на цепочку, что-то вроде (myBean.getList())::add или myBean::getList::add или что-то еще?

Ответ 1

Нет, ссылки на методы не поддерживают цепочку. В вашем примере не было бы ясно, какой из двух методов должен получить второй параметр.


Но если вы настаиваете на этом...

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()) к его первому аргументу. Его легко представить, как выглядит эквивалентный метод утилиты для фильтрации второго аргумента или обоих сразу.

Однако он в основном полезен для объединения существующих реализаций с другой операцией. В вашем конкретном примере используемый сайт не лучше обычного выражения лямбда

BiConsumer<MyBean, String> c = (myBean, id) -> myBean.getList().add(id);