Java 8 链式方法参考?
Java 8 chained method reference?
假设有一个典型的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
或其他?
不,方法引用不支持链接。在您的示例中,不清楚这两种方法中的哪一种应该接收第二个参数。
但是如果你坚持的话……
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()
)。很容易想象用于过滤第二个参数或同时过滤两个参数的等效实用方法的样子。
但是,它主要用于将现有实现与另一个操作相结合。在你的具体例子中,use site并不比普通的lambda表达式好
BiConsumer<MyBean, String> c = (myBean, id) -> myBean.getList().add(id);
假设有一个典型的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
或其他?
不,方法引用不支持链接。在您的示例中,不清楚这两种方法中的哪一种应该接收第二个参数。
但是如果你坚持的话……
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()
)。很容易想象用于过滤第二个参数或同时过滤两个参数的等效实用方法的样子。
但是,它主要用于将现有实现与另一个操作相结合。在你的具体例子中,use site并不比普通的lambda表达式好
BiConsumer<MyBean, String> c = (myBean, id) -> myBean.getList().add(id);