【问题标题】:Java 8 chained method reference?Java 8 链式方法参考?
【发布时间】: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) -&gt; myBean.getList().add(id) 替换为链式方法引用,例如 (myBean.getList())::addmyBean::getList::add 或其他?

【问题讨论】:

  • map.put(SomeEnum.List, (myBean, id) -&gt; myBean.getList().add(id)); 做了什么?
  • 不,没有。方法引用不支持链接。在您的示例中,不清楚这两种方法中的哪一种应该接收第二个参数。无论如何,你为什么想要那个?
  • @Andremoniy 放入地图,BiConsumer 以 lambda 的形式给出。
  • @m3th0dman:你说的是返回值。我询问了参数。在您的示例中,您假设 BiConsumer 的第二个参数转到第二种方法,但编译器没有理由假设相同。
  • 您称其为“一致”,因为这是您的期望。但是没有任何规则可以解释为什么您假设的双方法引用应该表现得像 (x,y)-&gt;x.foo().bar(y) 而不是 (x,y)-&gt;x.foo(y).bar()。并且方法引用也可能引用static方法,所以也可以是(x,y)-&gt;Type.foo(x).bar(y)(x,y)-&gt;Type.foo(x, y).bar()(x,y)-&gt; Type.foo().bar(x,y)(x,y)-&gt;Type2.bar(Type1.foo(x), y)(x,y)-&gt; Type2.bar(Type1.foo(x, y))(x,y)-&gt;Type2.bar(Type1.foo(), x, y)(x,y)-&gt; Type2.bar(x.foo(), y)(x,y)-&gt;Type2.bar(x.foo(y))跨度>

标签: java lambda java-8 method-reference


【解决方案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);

该方法的命名建议将其视为采用现有的BiConsumer(此处为List.add)并在其第一个参数前添加一个函数(此处为MyBean.getList())。很容易想象一个等效的实用方法用于过滤第二个参数或同时过滤两者。

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

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

【讨论】:

  • 接受基于第一条评论 - 方法引用不支持链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多