在Java 8 Lambda上使用scala.Future

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)

Set*_*sue 4

scala -java8-compat库提供 Scala 2.11 和 Java 8 lambda 之间的互操作性。