Java 8 链接方法参考?

2022-09-01 10:00:42

假设有一个典型的 Java Bean:

class MyBean {
    void setA(String id) {
    }

    void setB(String id) { 
    }

    List<String> getList() {
    }
}

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

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())::addmyBean::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);

该方法的命名建议将其视为采用现有(此处,)并在其第一个参数之前附加函数(此处)。。很容易想象,用于同时过滤第二个参数或同时过滤两个参数的等效实用程序方法会是什么样子。BiConsumerList.addMyBean.getList()

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

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

答案 2

推荐