首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8链式方法引用?

Java 8链式方法引用?
EN

Stack Overflow用户
提问于 2015-03-19 21:42:33
回答 1查看 13.9K关注 0票数 31

假设有一个典型的Java Bean:

代码语言:javascript
复制
class MyBean {
    void setA(String id) {
    }

    void setB(String id) { 
    }

    List<String> getList() {
    }
}

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

代码语言:javascript
复制
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之类的东西?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-19 22:07:58

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

但是如果你坚持的话…

代码语言:javascript
复制
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);
}

代码语言:javascript
复制
BiConsumer<MyBean, String> c = filterFirstArg(List::add, MyBean::getList);

该方法的命名建议将其视为一个现有的BiConsumer (此处为List.add),并将一个函数(此处为MyBean.getList())作为其第一个参数的前缀。不难想象,用于同时过滤第二个参数或同时过滤两个参数的等效实用方法会是什么样子。

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

代码语言:javascript
复制
BiConsumer<MyBean, String> c = (myBean, id) -> myBean.getList().add(id);
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29146199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档