new DialogInterface.OnClickListener()
new MediaPlayer.OnPreparedListener()
等等,有没有办法使用新的Java lambda表达式来替换这些匿名类?
通过gradle / 外部库的一些配置,您可以在Android项目中使用lambda表达式。
要开始使用支持的Java 8语言特性,请将Android插件更新到3.0.0-alpha1(或更高版本)。
Android Studio不支持所有Java 8语言特性,但在未来的IDE版本中会添加更多功能。根据您使用的minSdkVersion,现在可用某些功能和API,如下表所述。
API级别24或更高
进一步阅读:支持的Java 8语言特性 https://developer.android.com/studio/write/java8-support.html
#Jack Compiler for Android
最近Google宣布支持Android中的Java 8功能,并且由于Jack编译器,您可以在代码中使用lambda。
进一步阅读:使用Java 8语言特性https://developer.android.com/guide/platform/j8-jack.html
Jack不再受支持,您应该首先禁用Jack以使用默认工具链中内置的改进的Java 8支持。 https://developer.android.com/studio/write/java8-support.html
您还可以使用外部库retrolambda。这是Java 8的lambda功能的后移版本,适用于Java 7、6和5。
您可以开始使用Kotlin / Lambda's with Kotlin来编写代码。
如需进一步阅读,可以参考一篇很好的文章,介绍如何处理Lambda函数
您只能为函数式接口替换匿名类。Lambda表达式需要函数式接口,即仅包含单个方法的接口。
您必须
enable jack in your app's gradle:
'defaultConfig { ... jackOptions { enabled true } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }'
now you can replace your anonymous class with lambda expression. for example: replace
mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onSomethingClicked();
}
});
to
mView.setOnClickListener(view -> onSomethingClicked())
需要注意的是,在启用jack编译器之后,仍然会生成匿名类。因此,请谨慎处理与匿名类相关的所有可能的泄漏问题。
我找到了一个非常好的短代码,可以使用lambda表达式转换所有匿名类。以下是上述匿名类的lambda表达式:
匿名类:
new DialogInterface.OnClickListener()
Lambda表达式:
(dialog, which) ->
匿名类:
new MediaPlayer.OnPreparedListener()
Lambda表达式:
mp ->
这不是很酷吗...