Синтаксис 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()
}