Синтаксис Kotlin для наблюдателя LiveData?

У меня есть следующий код кода в моей HomeActivity для использования LiveData.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    // Show the launch splash screen.
    //
    this.setContentView(R.layout.activity_home)

    this.viewModel = ViewModelProviders.of(this).get(HomeViewModel::class.java)

    this.viewModel.getUser().observe(this, Observer { user: User? ->

    });

}

Хотя это, похоже, работает, что означает следующая часть?

Observer { user: User? ->

}

Это должно привести к объекту, который соответствует интерфейсу Observer который имеет

void onChanged (T t)

https://developer.android.com/reference/android/arch/lifecycle/Observer.html

Как сделать

Observer { user: User? ->

}

привести к объекту с методом onChanged?

Я не знаю, что означает имя интерфейса перед выражением лямбда.

Спасибо!

Ответ 1

Это называется SAM Conversion, концепция, которая помогает взаимодействовать с Java Single Abstract Method Interfaces, как в вашем примере.

Ниже приведена реализация Runnable, где выполняется один абстрактный метод run():

val runnable = Runnable { println("This runs in a runnable") }

Его описание описано в документах: https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions

Альтернативно, но более подробным, было бы использование object:

val runnable2 = object : Runnable {
        override fun run() {
            println("This runs in a runnable")
        }
}

Оба являются примерами анонимных реализаций этого interface. Разумеется, также возможно создать конкретный подкласс и затем создать его.

class MyRunnable : Runnable {
    override fun run() {
        println("This runs in a runnable")
    }
}

val runnable3 = MyRunnable()

Ответ 2

в Kotlin лямбда Observer { } дает вам параметр it, вы можете переименовать его по своему усмотрению и использовать. по умолчанию данные будут доступны с it.something() и т.д.

JAVA:

... new Observer {
  void onChanged(User user){
     user.something()
  }
}

Котлин

... object : Observer<User> {
   fun onChanged(user: User?){
        user.something()
   }
}

ИЛИ

... Observer {
   it.something()
}

вы можете переименовать его как хотите

... Observer { myUser ->
   myUser.something()
}