Взаимосвязь функциональных интерфейсов в Java и Kotlin
15 марта 2022 г.Привет всем, почти все мы видели код вроде view.setOnClickListener { }
или view.setOnLongClickListener { }
в Kotlin, и когда вы нажимаете на него, чтобы увидеть исходный код, он покажет вам интерфейс Java OnClickListener. Но задавались ли вы вопросом, что это за синтаксис? Это расширение Котлина? и как вы можете вызвать свой собственный слушатель таким образом? В этой небольшой статье вы узнаете ответы на все эти вопросы, так что приступим 😋.
Этот синтаксис является не расширением, а преобразованием SAM, но что означает SAM?
SAM означает интерфейс с одним абстрактным методом, который также называется функциональным интерфейсом, представляющим собой интерфейс только с одним методом, отличным от метода по умолчанию, и любым количеством методов по умолчанию, например. В JDK у нас есть класс Runnable, который имеет только один метод с именем run. а в Android SDK есть OnClickListener, OnLongClickListener и т. д.
Как мы можем создать собственный функциональный интерфейс?
Объявить функциональный интерфейс в Java легко. Вы просто создаете нормальный интерфейс с одним методом, например.
```java
открытый интерфейс FunInterface {
недействительный метод();
А в Kotlin, начиная с версии 1.4, вам нужно объявить его как забавный интерфейс, а не только интерфейс, например.
```java
забавный интерфейс FunInterface {
забавный метод ()
Например, в Kotlin вы можете использовать интерфейсы Java или Kotlin Functional в качестве лямбда-выражения.
```javascript
весело выучитьFunInterface(fi : FunInterface) { ... }
Вам эту функцию вы можете передать FunInterface, например, как анонимный объект.
```javascript
LearnFunInterface (объект: FunInterface {
переопределить забавный метод () {
println("Привет")
Но поскольку это функциональный интерфейс, вы можете передать его как лямбда {}, и это то, что называется преобразованием SAM.
```javascript
LearnFunInterface ({ println ("Привет") })
также в Kotlin, если ваш последний параметр является функциональным интерфейсом, вы можете, например, переместить свою лямбду за скобки ( ).
```javascript
LearnFunInterface {
println("Привет")
Теперь вы можете видеть, что setOnClickListener { }
просто потому, что этот метод принимает в качестве параметра функциональный интерфейс, который является OnClickListener
.
Обратите внимание, что тот же синтаксис будет работать и на Kotlin, если ваш функциональный интерфейс написан на Java, например OnClickListener.
Дополнительные ресурсы:
Вы можете найти меня на: GitHub, LinkedIn , Twitter.
Наслаждайтесь программированием 😋.
Эта статья была впервые опубликована [здесь] (https://itnext.io/functional-interfaces-in-kotlin-ec6ab9e472e3).
Оригинал