在此方法中找不到对返回值的引用

时间:2018-10-09 15:39:50

标签: java android kotlin

我正在检查这个repository来实现类似redux的android实现。在file中,我发现了如下的方法实现:

@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 ,因为Android Studio的Kotlin转换器在这种情况下无济于事。感谢您的帮助。谢谢!

2 个答案:

答案 0 :(得分:5)

您拥有的是lambda。这是编写一些代码的简化形式。当然,并不是所有的东西都有lambda,但是确实如此。在您的情况下,您将创建一个与Dispatcher匹配的匿名类。

具有Java 8语言功能(如果您不在Android上,则具有Java 8本身),可以使用lambda声明带有一种方法的接口,可以选择使用@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参数声明函数,则不需要int x

Kotlin中有一些例外(我遇到了编译器,抱怨它无法推断类型,只是手动设置类型使其再次编译),但是没有很多。

无论如何,action是方法中定义的单个参数。您基本上是在进行基于lambda的继承,因此需要在方法中使用它,但不必使用它(取决于您的实现)。

在Kotlin中,接口的lambda略有不同。用Java声明的接口可以在Kotlin lambda中使用:

override fun create(store: Store<AppState>, nextDispatcher: Dispatcher) /*: Dispatcher*/
        = Dispatcher { x -> //Arguments declared here
            // add your actions here
        }

但是,this bug阻止以这种方式声明Kotlin声明的接口。您需要使用object : WhateverInterface并添加正文。 (在1.2.70中也遇到了此问题,因此尚未解决)。

答案 1 :(得分:1)

基本上是Lambda

  

匿名类的一个问题是,如果您的   匿名类非常简单,例如一个包含以下内容的接口   只有一种方法,那么匿名类的语法似乎   笨拙和不清楚。在这些情况下,您通常会尝试通过   功能作为另一个方法的参数,例如什么动作   单击某人时应采取的措施。 Lambda表达式   使您能够执行此操作,将功能视为方法参数,或者   代码作为数据。

Dispatcher是一个类的接口。一类接口称为功能接口,从Java 8开始,可以用lambda表示。因此,您将看到Dispatchers dispatch 方法的实现。