2015-01-05 80 views
3

我试图写一个简单的转换器,把一个java.util.Functionscala.Function1编写一个返回函数=> T

def toScalaProducer[T](f: JavaFunction0[T]) : => T = => f() 

这里是行之有效另一种变体:

def toScalaFunction[T](f: JavaFunction0[T]) :() => T = 
() => f.apply() 

问题是我想将转换的函数传递到现有的Scala API中,但that API只接受=> T类型的参数,而不是() => T类型的参数。

有没有办法写toScalaProducer函数?

+0

你确定这不工作?这不是一种类型,这就是所谓的懒惰评估,也就是说,您传入的内容只是在方法主体中需要时才评估,而不是之前,简而言之,您需要传入“A”作为类型,并且'()=> T'非常好。 –

回答

6

() => T是不带任何参数,并返回一个类型的东西T

=> T是一个价值T是懒洋洋地评估类型的函数的类型。例如:

def myFunc(t: => Int): Unit = { 
    // Do something with t 
} 

myFunc(reallyExpensiveFunctionProducingAnInt()) 

这里,reallyExpensiveFunctionProducingAnInt可能需要很长的时间来运行,但如果该值tmyFunc使用才会执行。如果您只使用类型Int而不是=> Int它将在输入myFunc之前调用。

看看这里了解更多信息:Scala's lazy arguments: How do they work?

因此,如果您toScalaProducer功能只是执行的Java功能,并具有T返回值,它应该很好地工作的API。它只会在需要时执行,所以在很多方面都会像传递函数一样行事。

相关问题