Что у вас есть лямбда?Это сокращенная форма написания некоторых фрагментов кода.Конечно, не во всех есть лямбда, но это так.В вашем случае вы создаете анонимный класс, соответствующий Dispatcher
.
С помощью функций языка Java 8 (или самой Java 8, если вы не используете Android) позволяет интерфейсам с одним методом, опционально аннотированным @FunctionalInterface, объявляться с помощью лямбды.Т.е. это:
Runnable x = new Runnable() {
@Override public void run(){
// Foo bar
}
};
То же, что и:
Runnable x = () -> {
// Foo bar
};
Это относится ко всем интерфейсам с одним методом.Они могут быть аннотированы @FunctionalInterface, но это не обязательно.
Диспетчер - один из кода, который вы разместили.Синтаксис довольно прост:
() -> {
// () means 0 args. It can contain arguments if necessary
return "return value if applicable";
}
С аргументами:
oneArg -> {
//Method body
}
(arg1, arg2) -> {
// MethodBody
}
Методы с типами возврата могут быть упрощены до однострочных, если вам это нравится:
() -> "some string return type"
и тот же шаблон с аргументами;Я не собираюсь добавлять примеры для этого снова.То же самое, что и выше, применимо.
Я использовал различные скобки в этом ответе.На самом деле есть некоторые «правила» их использования.Компилятор будет жаловаться, если синтаксис неправильный, но обычно:
- Один аргумент не нуждается в () вокруг него.Это не обязательно здесь.
- Ноль или два и более аргументов требуют их.
Не требуется явного объявления типа в Kotlin или Java;это обрабатывается автоматически.Что касается Java, ему не нужно, то есть int x
, если интерфейс объявляет функцию с аргументом int.
Есть некоторые исключения в Kotlin (я столкнулся с компилятором, который жаловался, что он не может определить типы, просто установив тип вручную, он снова скомпилировался), но их немного.
В любом случае, action
здесь - единственный аргумент, определенный в методе.По сути, вы используете лямбда-наследование, поэтому вам необходимо иметь его в методе, но вам не нужно его использовать (в зависимости от вашей реализации).
В Kotlin лямбда для интерфейсов немного отличается.Интерфейсы, объявленные в Java, могут использоваться в лямбдах Kotlin:
override fun create(store: Store<AppState>, nextDispatcher: Dispatcher) /*: Dispatcher*/
= Dispatcher { x -> //Arguments declared here
// add your actions here
}
Однако эта ошибка препятствует тому, чтобы объявленные Kotlin интерфейсы были объявлены таким образом.Вам нужно будет использовать object : WhateverInterface
и добавить тело.(Обнаружил, что в 1.2.70 тоже, так что это еще не исправлено).