使用scala.Future和Java 8 lambdas
发布时间:2020-12-16 10:00:15 所属栏目:安全 来源:网络整理
导读:scala Future类有几种基于函数式编程的方法.从 Java调用时,看起来使用 Java 8中的lambdas会很自然. 但是,当我尝试实际使用它时,我遇到了几个问题.以下代码无法编译 someScalaFuture.map(val - Math.sqrt(val)). map(val - val + 3); 因为map将ExecutionConte
scala Future类有几种基于函数式编程的方法.从
Java调用时,看起来使用
Java 8中的lambdas会很自然.
但是,当我尝试实际使用它时,我遇到了几个问题.以下代码无法编译 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的匿名类并实现了这样的应用: 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实现的细节. 我是否走上了可行的道路?有这种方式使用lambdas的合理方法吗?如果有一个库使这项工作,这是一个可接受的解决方案.理想情况下,像 import static org.thirdparty.MakeLambdasWork.wrap; ... wrap(someScalaFuture).map(val -> Math.sqrt(val)). map(val -> val + 3); 解决方法
scala-java8-compat库提供了Scala 2.11和Java 8 lambdas之间的互操作性.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |