Tro*_*els 5 java lambda functional-programming scala
scala Future类有几种基于函数式编程的方法。从Java调用时,似乎很自然地使用Java 8中的lambda。
但是,当我尝试实际使用它时,遇到了一些问题。以下代码无法编译
someScalaFuture.map(val -> Math.sqrt(val)).
map(val -> val + 3);
Run Code Online (Sandbox Code Playgroud)
因为map会将an ExecutionContext作为隐式参数。在Scala中,您可以(通常)忽略它,但是需要在Java中显式传递它。
someScalaFuture.map(val -> Math.sqrt(val),
ec).
map(val -> val + 3,
ec);
Run Code Online (Sandbox Code Playgroud)
失败并显示以下错误:
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
Run Code Online (Sandbox Code Playgroud)
如果我实际上创建了一个扩展Function1的匿名类并实现apply为:
someScalaFuture.map(new Function1<Double, Double>() {
public double apply(double val) { return Math.sqrt(val); }
},
ec).
map(val -> val + 3,
ec);
Run Code Online (Sandbox Code Playgroud)
我得到一个错误
error: <anonymous com.example.MyTestClass$1> is not abstract and does not override abstract method apply$mcVJ$sp(long) in Function1
Run Code Online (Sandbox Code Playgroud)
我还没有尝试实现该方法(并且不确定是否可以实现名称中间带有美元符号的方法),但这似乎让我开始怀疑Scala实现的细节。
我要走可行的道路吗?是否存在以这种方式使用lambda的合理方法?如果有一个库可以完成这项工作,那是可以接受的解决方案。理想情况下,
import static org.thirdparty.MakeLambdasWork.wrap;
...
wrap(someScalaFuture).map(val -> Math.sqrt(val)).
map(val -> val + 3);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
939 次 |
| 最近记录: |