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)用链式方法引用替换 lambda,比如(myBean.getList())::addmyBean::getList::add别的什么?

4

1 回答 1

22

不,方法引用不支持链接。在您的示例中,不清楚这两种方法中的哪一种应该接收第二个参数。


但是如果你坚持的话……</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())添加到其第一个参数。很容易想象过滤第二个参数或同时过滤两个参数的等效实用方法可能是什么样子。

但是,它主要用于将现有实现与另一个操作相结合。在您的具体示例中,使用站点并不比普通的lambda表达式好

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