Scala 编写返回=>;T
我试图编写一个简单的转换器,将Scala 编写返回=>;T,scala,Scala,我试图编写一个简单的转换器,将java.util.Function转换为scala.Function1: def toScalaProducer[T](f: JavaFunction0[T]) : => T = => f() 下面是另一个运行良好的变体: def toScalaFunction[T](f: JavaFunction0[T]) : () => T = () => f.apply() 问题是我想将转换后的函数传递到现有的Scala API中,但只接受
java.util.Function
转换为scala.Function1
:
def toScalaProducer[T](f: JavaFunction0[T]) : => T = => f()
下面是另一个运行良好的变体:
def toScalaFunction[T](f: JavaFunction0[T]) : () => T =
() => f.apply()
问题是我想将转换后的函数传递到现有的Scala API中,但只接受类型为=>T
的参数,而不是类型为()=>T
的参数
有没有办法编写toScalaProducer
函数?()=>T
是一个函数的类型,它不带参数,返回类型为T
=>T
是延迟计算的值T
的类型。例如:
def myFunc(t: => Int): Unit = {
// Do something with t
}
myFunc(reallyExpensiveFunctionProducingAnInt())
在这里,reallycexpensivefunctionproducingant
可能需要很长时间才能运行,但只有在myFunc
中使用值t
时才会执行。如果您只是使用typeInt
而不是=>Int
,则在输入myFunc
之前会调用它
有关更多信息,请查看此处:
因此,如果您的
toScalaProducer
函数只是执行了Java函数,并且返回值为T
,那么它应该可以与API配合使用。它只会在需要时执行,因此在许多方面,它的行为就像传递函数一样。您确定这不起作用吗?这不是一种类型,称为惰性求值,也就是说,作为a
传入的东西只在方法体中需要时才进行求值,而不是在之前,简而言之,您需要作为类型传入a
,并且()=>T
非常好。