我正在检查这个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转换器在这种情况下无济于事。感谢您的帮助。谢谢!
答案 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 方法的实现。