Scala的Future
类有多个基于函数式编程的方法。当从Java中调用时,使用Java 8的lambda表达式似乎是一个自然的选择。
然而,当我尝试实际使用它时,遇到了几个问题。以下代码无法编译:
someScalaFuture.map(val -> Math.sqrt(val)).
map(val -> val + 3);
因为map函数需要一个隐式的ExecutionContext
参数。在Scala中,你通常可以忽略这一点,但在Java中需要显式传递。
someScalaFuture.map(val -> Math.sqrt(val),
ec).
map(val -> val + 3,
ec);
这会导致以下错误:
error: method map in interface Future<T> cannot be applied to given types;
[ERROR] val),ExecutionContextExecutor
reason: cannot infer type-variable(s) S
(argument mismatch; Function1 is not a functional interface
multiple non-overriding abstract methods found in interface Function1)
where S,T are type-variables:
S extends Object declared in method <S>map(Function1<T,S>,ExecutionContext)
T extends Object declared in interface Future
如果我创建了一个继承Function1的匿名类,并实现apply方法如下:
someScalaFuture.map(new Function1<Double, Double>() {
public double apply(double val) { return Math.sqrt(val); }
},
ec).
map(val -> val + 3,
ec);
我收到一个错误信息,内容为:
error: <anonymous com.example.MyTestClass$1> is not abstract and does not override abstract method apply$mcVJ$sp(long) in Function1
我没有尝试实现这种方法(也不确定是否可以在名称中间使用美元符号实现方法),但这似乎是我开始探讨Scala实现的细节。
我走的路径可行吗?有没有合理的方法以这种方式使用lambda表达式?如果有一个可以使这个工作的库,那么这是一个可接受的解决方案。理想情况下,像这样的东西
import static org.thirdparty.MakeLambdasWork.wrap;
...
wrap(someScalaFuture).map(val -> Math.sqrt(val)).
map(val -> val + 3);