2017-10-07 32 views
1

我正在使用Scala 2.12.2和Java 8.对于一个非常奇怪的情况,我需要在Java中使用Scala Futures,并且我看到在未来的操作符中使用Lambdas它不起作用。Scala中的Lambda表达式未来

@Test 
public void test(){ 
    Future<String> future = new Promise.DefaultPromise(); 
    future.map(value -> value.toUpperCase()) 
      .onComplete(value -> System.out.println(value)); 
} 

错误消息说:

Future cannot be applied to lambda expression 

但后读的斯卡拉版本2.12 http://www.scala-lang.org/news/2.12.0/

我了解,从现在开始,从Java8 lambda表达式是Scala的API兼容的文档。

我误解了一些东西吗?

+1

我从来没有尝试过使用Scala的'Future's从Java。但我想这不是一个API,意味着从Java中使用。例如。几乎每个方法都需要一个**隐式** ExecutionContext。 Java没有含义。 Java拥有自己的“未来”。 –

+0

那么我们有一个Scala + Java代码的保护,所以我们必须接受Scala的Futures将在Java环境中的事实。 – paul

+0

嗨保罗,DefaultPromise是一个实现细节,不打算用于外部使用(正如在impl包和被封装保护中见证的那样)。你有没有考虑过使用这个:https://github.com/scala/scala-java8-compat –

回答

1

这在这里工作得很好

scala.concurrent.Future<String> f = scala.concurrent.Future.successful("abc"); 
scala.concurrent.Future<String> f2 = f.map(s -> s.toUpperCase(), scala.concurrent.ExecutionContext.global()); 
f2.foreach(s -> {System.out.println(s); return null;}, scala.concurrent.ExecutionContext.global()); 
+0

嗯,我在做什么错在这里?我在我的Scala 2.12.2项目和JDK Java 8项目中使用了IntelliJ和SDK。还有其他需要配置的东西? – paul

+0

我不知道。我的代码不适合你吗?顺便说一句。我只用Java 9和Scala 2.12.3测试它。 – SpiderPig

+0

你在使用IntelliJ吗? – paul