В вашем примере используется функция SAM-конструктора. Слушатель setOnEditorActionListener
принимает OnEditorActionListener
в качестве параметра. Этот интерфейс имеет только один метод, который необходимо реализовать, что делает его интерфейсом единого абстрактного метода (SAM).
Полный синтаксис для использования этого метода в Java:
mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
attemptLogin();
return true;
}
});
Индивидуальное преобразование в Kotlin даст вам:
mPasswordView.setOnEditorActionListener(object: TextView.OnEditorActionListener{
override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean {
attemptLogin()
return true
}
})
Kotlin, однако, позволяет вам использовать методы, которые принимают интерфейсы SAM в качестве параметра с более кратким синтаксисом, вместо этого передавая лямбду. Это называется преобразованием SAM:
mPasswordView.setOnEditorActionListener { v, actionId, event ->
attemptLogin()
true
}
Преобразования SAM автоматически определяют, какому интерфейсу соответствует эта лямбда, но вы можете указать это явно, используя нечто, называемое конструктором SAM, это то, что находится в вашем примере кода. Конструктор SAM возвращает объект, реализующий заданный интерфейс, и делает переданную ему лямбду реализацией единственного метода.
mPasswordView.setOnEditorActionListener( TextView.OnEditorActionListener { v, actionId, event ->
attemptLogin()
true
})
Это избыточно в данной конкретной ситуации, поскольку существует только один метод с именем setOnEditorActionListener
. Но если бы было несколько методов с одним и тем же именем, которые принимали разные интерфейсы в качестве параметров, вы могли бы использовать конструктор SAM, чтобы указать, какую перегрузку метода вы хотите вызвать.
Официальные документы о преобразованиях SAM
person
zsmb13
schedule
23.04.2017