假设有一个典型的Java Bean:
class MyBean {
void setA(String id) {
}
void setB(String id) {
}
List<String> getList() {
}
}我想创建一种更抽象的方式,在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));有没有一种方法可以用一个链式的方法引用来代替lambda (myBean, id) -> myBean.getList().add(id),比如(myBean.getList())::add或者myBean::getList::add之类的东西?
发布于 2015-03-19 22:07:58
不支持,方法引用不支持链接。在您的示例中,不清楚这两个方法中的哪一个应该接收第二个参数。
但是如果你坚持的话…
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())作为其第一个参数的前缀。不难想象,用于同时过滤第二个参数或同时过滤两个参数的等效实用方法会是什么样子。
但是,它主要用于将现有实现与另一个操作相结合。在您的特定示例中,使用位置并不比普通的lambda表达式更好
BiConsumer<MyBean, String> c = (myBean, id) -> myBean.getList().add(id);https://stackoverflow.com/questions/29146199
复制相似问题