2016-09-23 49 views
3

我寫這段代碼在斯卡拉:如何在Scala中爲java.unaryOperator <T>接口編寫lambda?

def push(x: T): Unit = ref.updateAndGet(new UnaryOperator[List[T]] { 
    override def apply(t: List[T]): List[T] = x :: t 
}) 

而且要重寫它的功能更強大的方式,像

def push(x: T): Unit = ref.updateAndGet(t => x::t) 

但它不起作用。是否有可能正確執行此類投射?

+0

版本和結果? 'def f [A](a:A)(g:UnaryOperator [A])= g(a); f(「hi」)(_ * 2)' –

回答

1

在斯卡拉2.12(RC 1已經發布),這將自動完成(即ref.updateAndGet(t => x::t)將只是工作)。在Scala 2.11中這已經存在,但在-Xexperimental編譯器標誌下,並且支持是不完整的(我不知道確切的限制)。

4

scala-java8-compat具有java8功能轉換

import scala.compat.java8.FunctionConverters._ 

def push(x: T): Unit = ref.updateAndGet(asJavaUnaryOperator(t => x::t))