Spec-Zone.ru › Kotlin 1.4

Функциональные (SAM) интерфейсы

Интерфейс с только одним абстрактным методом называется функциональным интерфейсом или интерфейсом Single Abstract Method (SAM). Функциональный интерфейс может иметь несколько неабстрактных членов, но только один абстрактный член.

Чтобы объявить функциональный интерфейс в Kotlin, используйте модификатор fun.

fun interface KRunnable {
   fun invoke()
}

Преобразования SAM

Для функциональных интерфейсов можно использовать преобразования SAM, которые помогают сделать ваш код более лаконичным и читаемым, используя лямбда-выражения.

Вместо создания класса, который вручную реализует функциональный интерфейс, можно использовать лямбда-выражение. С преобразованием SAM Kotlin может преобразовать любое лямбда-выражение, чья сигнатура соответствует сигнатуре единственного метода интерфейса, в экземпляр класса, реализующего интерфейс.

Например, рассмотрим следующий Kotlin функциональный интерфейс:

fun interface IntPredicate {
   fun accept(i: Int): Boolean
}

Если вы не используете преобразование SAM, вам нужно написать код, подобный этому:

// Creating an instance of a class
val isEven = object : IntPredicate {
   override fun accept(i: Int): Boolean {
       return i % 2 == 0
   }
}

Используя преобразование SAM Kotlin, вместо этого можно написать следующий эквивалентный код:

// Creating an instance using lambda
val isEven = IntPredicate { it % 2 == 0 }

Короткий лямбда-выражение заменяет весь ненужный код.

fun interface IntPredicate {
   fun accept(i: Int): Boolean
}

val isEven = IntPredicate { it % 2 == 0 }

fun main() {
   println("Is 7 even? - ${isEven.accept(7)}")
}

Вы также можете использовать преобразования SAM для Java-интерфейсов.

Функциональные интерфейсы против псевдонимов типов

Функциональные интерфейсы и псевдонимы типов служат разным целям. Псевдонимы типов — это просто имена для существующих типов; они не создают новый тип, в то время как функциональные интерфейсы — создают.

Псевдонимы типов могут иметь только один член, в то время как функциональные интерфейсы могут иметь несколько неабстрактных членов и один абстрактный член. Функциональные интерфейсы также могут реализовывать и расширять другие интерфейсы.

Учитывая вышесказанное, функциональные интерфейсы более гибкие и предоставляют больше возможностей, чем псевдонимы типов.

© 2010–2020 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/reference/fun-interfaces.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API