【发布时间】:2017-07-20 06:32:05
【问题描述】:
假设有一个典型的Java Bean:
class MyBean {
void setA(String id) {
}
void setB(String id) {
}
List<String> getList() {
}
}
我想在 BiConsumer 的帮助下创建一种更抽象的调用设置器的方法:
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 或其他?
【问题讨论】:
-
map.put(SomeEnum.List, (myBean, id) -> myBean.getList().add(id));做了什么? -
不,没有。方法引用不支持链接。在您的示例中,不清楚这两种方法中的哪一种应该接收第二个参数。无论如何,你为什么想要那个?
-
@Andremoniy 放入地图,
BiConsumer以 lambda 的形式给出。 -
@m3th0dman:你说的是返回值。我询问了参数。在您的示例中,您假设
BiConsumer的第二个参数转到第二种方法,但编译器没有理由假设相同。 -
您称其为“一致”,因为这是您的期望。但是没有任何规则可以解释为什么您假设的双方法引用应该表现得像
(x,y)->x.foo().bar(y)而不是(x,y)->x.foo(y).bar()。并且方法引用也可能引用static方法,所以也可以是(x,y)->Type.foo(x).bar(y)或(x,y)->Type.foo(x, y).bar()或(x,y)-> Type.foo().bar(x,y)或(x,y)->Type2.bar(Type1.foo(x), y)或(x,y)-> Type2.bar(Type1.foo(x, y))或(x,y)->Type2.bar(Type1.foo(), x, y)或(x,y)-> Type2.bar(x.foo(), y)或(x,y)->Type2.bar(x.foo(y))跨度>
标签: java lambda java-8 method-reference