2017-10-07 81 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