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

问题描述:

我们在android项目中使用了很多匿名类。例如:如何用lambda表达式替换匿名类android

new DialogInterface.OnClickListener() 

new MediaPlayer.OnPreparedListener() 

等有什么办法可以用新的Java lambda表达式来替换这些类型的匿名类吗?

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

你必须

  1. 能够在应用程序的gradle这个jack

    “defaultConfig { ... jackOptions { 启用真正 }} 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()) 

要记住,启用插孔在编译步骤仍然产生匿名类是很重要的。所以,要小心所有可以用匿名类进行的泄漏。

通过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 -> 

是不是很酷?