【发布时间】:2019-01-21 00:31:00
【问题描述】:
当我尝试将函数组合与两个 void 方法一起使用时,我遇到了一个奇怪的(对我来说)行为。我写了一个简单的例子来说明这个问题:
public class Startup {
public static void main(String[] args) {
List<Foo> foos = new ArrayList<>();
// 1) Does not compile
foos.forEach(Startup::doSomething1.andThen(Startup::doSomething2));
Consumer<Foo> doSomething1 = Startup::doSomething1;
Consumer<Foo> doSomething2 = Startup::doSomething2;
// 2) Works as expected
foos.forEach(doSomething1.andThen(doSomething2));
}
public static void doSomething1(Foo foo) {
}
public static void doSomething2(Foo foo) {
}
public static class Foo {
}
}
当我尝试编译第一个解决方案时,它会在然后调用之前显示“')' 预期”。
当我明确说这是消费者时,代码已编译并按预期工作。
谁能向我解释为什么会发生这种情况,是否有另一种方法可以使用 Java 8 对 void 方法进行函数组合?
【问题讨论】:
-
期望
Startup::doSomething1严格来说是Consumer<Foo>?不,也可以是interface FooTaker{void takeFoo(Foo f);}...不过在此之前,这是语法问题... -
我的猜测是,从方法句柄到
Consumer<Foo>的隐式转换在您使用.令牌时并没有发生;显式转换可能会起作用。
标签: java lambda java-8 functional-programming