Взаимосвязь функциональных интерфейсов в Java и Kotlin

Взаимосвязь функциональных интерфейсов в 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.


Дополнительные ресурсы:





Вы можете найти меня на: GitHubLinkedIn Twitter.


Наслаждайтесь программированием 😋.


Эта статья была впервые опубликована [здесь] (https://itnext.io/functional-interfaces-in-kotlin-ec6ab9e472e3).



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE