Reputation: 222
I'm trying to write a simple converter that turns a java.util.Function
into a scala.Function1
:
def toScalaProducer[T](f: JavaFunction0[T]) : => T = => f()
Here is another variant that works well:
def toScalaFunction[T](f: JavaFunction0[T]) : () => T =
() => f.apply()
The problem is that I want to pass the converted function into an existing Scala API, but that API only accepts arguments of type => T
, not of type () => T
.
Is there a way to write the toScalaProducer
function?
Upvotes: 3
Views: 117
Reputation: 808
() => T
is the type for a function that takes no arguments and returns something of type T
=> T
is the type for a value T
that is lazily evaluated. For instance:
def myFunc(t: => Int): Unit = {
// Do something with t
}
myFunc(reallyExpensiveFunctionProducingAnInt())
Here, reallyExpensiveFunctionProducingAnInt
could take a long time to run, but will only be executed if the value t
is used in myFunc
. If you just use type Int
instead of => Int
it will have been called before myFunc
is entered.
Have a look here for more information: Scala's lazy arguments: How do they work?
So if your toScalaProducer
function simply executed the Java function and had a return value of T
, it should work fine with the API. It will only be executed when needed, so in many ways will behave like passing a function.
Upvotes: 6