如何用lambda表达式替换匿名类android
我们在android项目中使用了很多匿名类。例如:如何用lambda表达式替换匿名类android
new DialogInterface.OnClickListener()
new MediaPlayer.OnPreparedListener()
等有什么办法可以用新的Java lambda表达式来替换这些类型的匿名类吗?
您只能替换功能接口的匿名类。 Lambda表达式需要functional interface即仅包含单一方法的接口。
你必须
-
能够在应用程序的gradle这个jack:
“defaultConfig { ... jackOptions { 启用真正 }} compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }'
-
现在您可以用lambda表达式替换您的匿名类。例如: 更换
mView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onSomethingClicked(); } });
到
mView.setOnClickListener(view -> onSomethingClicked())
要记住,启用插孔在编译步骤仍然产生匿名类是很重要的。所以,要小心所有可以用匿名类进行的泄漏。
通过gradle /使用外部库进行一些配置,您可以在Android项目中使用lambda表达式。
开箱即用的Java 8语言功能
要开始使用支持的Java 8语言特性,更新Android插件到3.0.0-α1(或更高版本)。
Android Studio不支持所有的Java 8语言功能,但是将来版本的IDE中会添加更多功能。根据您使用的minSdkVersion,现在可以使用某些功能和API,如下表所述。
- Lambda表达式任何。
- 方法参考任何。
- 类型注解任何。
- 默认和静态接口方法任何。
- 重复注释任何。
API级别24或更高
- 的java。lang.annotation.Repeatable。
- AnnotatedElement.getAnnotationsByType(类)
- java.util.stream
- java.lang.FunctionalInterface
- java.lang.reflect.Method.isDefault()
- java.util.function
延伸阅读:支持的Java 8语言特点 https://developer.android.com/studio/write/java8-support.html
#杰克编译器为Android
最近谷歌宣布为Android的Java的八大特点和感谢杰克编译器,你可以在你的代码中使用lambda表达式的支持。
延伸阅读:使用的Java 8语言功能https://developer.android.com/guide/platform/j8-jack.html
不再支持杰克,你应该先禁用杰克使用内置的默认工具链的改进的Java 8支持。 https://developer.android.com/studio/write/java8-support.html
Retrolambda
你可以选择使用外部库retrolambda。这就是Java 8的lambda功能对Java 7.6和一个补丁包,5
科特林
你可以开始Kotlin/Lambda's with Kotlin编写代码。
对于进一步的阅读,有一个nice article how to handle Lambda's
我发现很漂亮的短代码与lambda表达式转换所有匿名类的。下面是上述匿名类lambda表达式:
匿名类:
new DialogInterface.OnClickListener()
Lambda表达式:
(dialog, which) ->
匿名类:
new MediaPlayer.OnPreparedListener()
Lambda表达式:
mp ->
是不是很酷?