Eirik Sletteberg
Eirik Sletteberg

Reputation: 222

Writing a function that returns => T

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

Answers (1)

Rajit
Rajit

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

Related Questions