Java 8链式方法参考?

m3t*_*man 16 java lambda java-8 method-reference

假设有一个典型的Java Bean:

class MyBean {
    void setA(String id) {
    }

    void setB(String id) { 
    }

    List<String> getList() {
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在BiConsumer的帮助下创建一种更抽象的方式来调用setter:

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));
Run Code Online (Sandbox Code Playgroud)

有没有一种方法,以取代拉姆达(myBean, id) -> myBean.getList().add(id)与链接的方法引用,类似(myBean.getList())::add或者myBean::getList::add还是其他什么东西?

Hol*_*ger 12

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


但如果你坚持下去......

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);
}
Run Code Online (Sandbox Code Playgroud)

...

BiConsumer<MyBean, String> c = filterFirstArg(List::add, MyBean::getList);
Run Code Online (Sandbox Code Playgroud)

该方法的命名建议将其视为采用现有BiConsumer(此处List.add)并将函数(此处MyBean.getList())添加到其第一个参数.很容易想象一个等效的实用方法如何一次过滤第二个参数或两者.

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

BiConsumer<MyBean, String> c = (myBean, id) -> myBean.getList().add(id);
Run Code Online (Sandbox Code Playgroud)

  • 根据第一条评论接受 - 方法引用不支持链接. (2认同)