加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用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之间的互操作性.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读