Mad*_*hat 1 java android kotlin
我在这个存储库中签出了类似redux的android实现。在一个文件中,我找到了如下的方法实现:
@Override
public Dispatcher create(Store<AppState> store, Dispatcher
nextDispatcher) {
return action -> {
log("dispatching action: " + action);
nextDispatcher.dispatch(action);
log("new state: " + store.getState());
};
}
Run Code Online (Sandbox Code Playgroud)
我无法了解return此方法的工作原理,因为没有提到action??。还想知道如何将此方法实现转换为Kotlin,因为在这种情况下Android Studio的Kotlin转换器无济于事。感谢您的帮助。谢谢!
你拥有的是lambda。这是编写一些代码的简化形式。当然,并不是所有的东西都有lambda,但是确实如此。在您的情况下,您将创建一个匹配的匿名类Dispatcher。
具有Java 8语言功能(如果您不在Android上,则具有Java 8本身)可以通过lambda声明带有一种方法的接口,可以选择使用@FunctionalInterface注释。即这个:
Runnable x = new Runnable() {
@Override public void run(){
// Foo bar
}
};
Run Code Online (Sandbox Code Playgroud)
是相同的:
Runnable x = () -> {
// Foo bar
};
Run Code Online (Sandbox Code Playgroud)
这适用于所有单方法接口。可以使用@FunctionalInterface对其进行批注,但这不是必需的。
Dispatcher是其中之一,来自您发布的代码。语法非常基本:
() -> {
// () means 0 args. It can contain arguments if necessary
return "return value if applicable";
}
Run Code Online (Sandbox Code Playgroud)
带参数:
oneArg -> {
//Method body
}
(arg1, arg2) -> {
// MethodBody
}
Run Code Online (Sandbox Code Playgroud)
如果您愿意,可以将具有返回类型的方法简化为单行代码:
() -> "some string return type"
Run Code Online (Sandbox Code Playgroud)
和带有参数的模式相同;我不会再为此添加示例。与上面相同。
我在此答案中使用了不同的括号。关于它们的使用,实际上存在一些“规则”。如果语法错误,编译器会抱怨,但通常是:
在Kotlin或Java中,它不需要显式的类型声明;它是自动处理的。对于Java,则不需要int x接口是否声明了带有int参数的函数。
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
}
Run Code Online (Sandbox Code Playgroud)
但是,此错误会阻止以这种方式声明Kotlin声明的接口。您需要使用object : WhateverInterface并添加主体。(在1.2.70中也遇到了此问题,因此尚未解决)。