Using guava's ListenableFuture with Kotlin

Figured it out.

Apparently this works:

  val executor = Executors.newFixedThreadPool(10)
  val service = MoreExecutors.listeningDecorator(executor)
  val future = service.submit<Int> { 42 }
  val transformed = Futures.transform(
      future,
      com.google.common.base.Function { it : Int? -> "[" + Integer.toString(it!!) + "]" },
      executor)

  Futures.addCallback(transformed, object : FutureCallback<String> {
    override fun onSuccess(result: String?) { println("Success: " + result!!) }
    override fun onFailure(t: Throwable) { t.printStackTrace() }
  })
  executor.shutdown()

A type declaration on a function argument (it: Int?) is essential, without this declaration, the code doesn’t compile.

Was difficult to figure out as the error message was complaining about a Function type, and apparently a guava’s Function was expected.

The code can be made even slightly more readable with a use of a typealias:

typealias GuavaFunction<I, O> = com.google.common.base.Function<I, O>

So the code becomes just this:

  val transformed = Futures.transform(
      future,
      GuavaFunction { it : Int? -> "[" + Integer.toString(it!!) + "]" },
      executor)

Yes, still, I wonder, is it possible to do it better, without an explicit indication that it’s a GuavaFunction, and without explicit argument type declaration in an anonymous function?