如何使用lambda表达式android替换匿名类

我们在android项目中使用了很多匿名类。 例如:

new DialogInterface.OnClickListener() new MediaPlayer.OnPreparedListener() 

等等有没有办法用新的Java lambda表达式来替换这些匿名类?

通过gradle /外部库的一些配置,你可以在你的Android项目中使用lambda表达式。

开箱即用的Java 8语言功能

要开始使用受支持的Java 8语言功能,请将Android插件更新到3.0.0-alpha1(或更高版本)。

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

#Jack编译器为Android

最近Google宣布支持Android中的Java 8功能,并且感谢Jack编译器,您可以在代码中使用lambdas。

进一步阅读:使用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

你也可以使用外部库retrolambda 。 这是Java 8的Java 6,6和5的lambda功能的后端。

科特林

你可以开始用Kotlin在Kotlin / Lambda中编写你的代码。

为了进一步阅读,有一篇很好的文章如何处理Lambda的

您只能替换功能接口的匿名类。 Lambda表达式需要一个功能接口,即只包含单一方法的接口。

你必须

  1. 在应用程序的gradle中启用插孔 :

    'defaultConfig {… jackOptions {enabled true}} compileOptions {sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}}'

  2. 现在你可以用lambda表达式替换你的匿名类。 例如:替换

     mView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onSomethingClicked(); } }); 

  mView.setOnClickListener(view -> onSomethingClicked()) 

请记住,启用jack仍然会在编译步骤中生成匿名类。 所以,要小心使用匿名类的所有漏洞。

我找到了非常好的简短代码,用lambda表达式转换所有的匿名类。 这里是上面提到的匿名类的lambda表达式:

匿名课堂:

  new DialogInterface.OnClickListener() 

Lambda表达式:

 (dialog, which) -> 

匿名课堂:

  new MediaPlayer.OnPreparedListener() 

Lambda表达式:

 mp -> 

不是很酷…