Невозможно найти ссылку на возврат в этом методе - PullRequest
0 голосов
/ 09 октября 2018

Я проверял этот репозиторий для реализации, подобной редуксу, для Android.Здесь, в файле , я нашел реализацию метода, как показано ниже:

@Override
public Dispatcher create(Store<AppState> store, Dispatcher 
nextDispatcher) {
   return action -> {
    log("dispatching action: " + action);
    nextDispatcher.dispatch(action);
    log("new state: " + store.getState());
       };
}

Я не могу понять, как работает return этого метода, так как нет ссылки наaction ??Также хотелось бы узнать, как преобразовать реализацию этого метода в Kotlin , так как конвертер Kotlin в Android Studio не помогает в этом случае.Был бы признателен за любую помощь в этом.Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Что у вас есть лямбда?Это сокращенная форма написания некоторых фрагментов кода.Конечно, не во всех есть лямбда, но это так.В вашем случае вы создаете анонимный класс, соответствующий 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 тоже, так что это еще не исправлено).

0 голосов
/ 09 октября 2018

В основном это лямбда .

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

Диспетчер - это интерфейс одного класса.Интерфейсы одного класса называются функциональными интерфейсами и из java 8 могут быть представлены лямбда-выражением.Итак, вы видите реализацию метода Dispatchers dispatch .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...