48

In Java 8 we can have a reference to a method of a Class' instance. Here's an example

Function1<Integer, Object> ref = a::getItem;

a is an instance of the class Adapter that has the method Object getItem(int i).

Can we do the same in Kotlin? I tried the same syntax without success. So far I was only able to create an extension method reference like so:

val ref: Adapter.(Int) -> Any = Adapter::getItem

But here I still need an instance of an Adapter to invoke it. The other alterantive I see is defining a lambda like this:

val ref: (Int) -> Any = { a.getItem(it) }
Kirill Rakhman
  • 42,195
  • 18
  • 124
  • 148
  • 11
    Capturing references are not supported yet, but will be supported in the future – Andrey Breslav Jan 19 '15 at 11:32
  • possible duplicate of [Kotlin: how to pass a function as parameter to another?](http://stackoverflow.com/questions/16120697/kotlin-how-to-pass-a-function-as-parameter-to-another) – Ram Feb 26 '15 at 23:40
  • 1
    Your option using a lambda is the current best method as-of 1.0, although it will change in the future to be supported as @AndreyBreslav mentions – Jayson Minard Dec 31 '15 at 11:38
  • 1
    Watch this issue in YouTrack for updates: https://youtrack.jetbrains.com/issue/KT-6947 – Jayson Minard Dec 31 '15 at 11:38

1 Answers1

25

Since Kotlin 1.1, you can use bound callable references to do that:

val f = a::getItem

list.forEach(myObject::myMethod)

Earlier Kotlin versions don't have this feature and require you to make a lambda every time except for these simple cases.

Community
  • 1
  • 1
hotkey
  • 140,743
  • 39
  • 371
  • 326
  • 1
    Thanks for the proposal link. For a Companion object's function, only this syntax seems to work [with Kotlin 1.3]: `(ClassA)::function` or `ClassA.Companion::function`. The first one can only be used in Kotlin, so for consistency between Java and Kotlin code, better to use the second syntax if you need to reference it in Java as well. – Javad Jul 21 '17 at 18:26