如何使用lambda表达式替换Android中的匿名类

3
我们在Android项目中使用了许多匿名类。例如:
new DialogInterface.OnClickListener()

new MediaPlayer.OnPreparedListener()

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

3个回答

4

通过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(Class)
  • 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 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

您还可以使用外部库retrolambda。这是Java 8的lambda功能的后移版本,适用于Java 7、6和5。

Kotlin

您可以开始使用Kotlin / Lambda's with Kotlin来编写代码。

如需进一步阅读,可以参考一篇很好的文章,介绍如何处理Lambda函数


4

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

您必须

  1. enable jack in your app's gradle:

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

  2. 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编译器之后,仍然会生成匿名类。因此,请谨慎处理与匿名类相关的所有可能的泄漏问题。


1

我找到了一个非常好的短代码,可以使用lambda表达式转换所有匿名类。以下是上述匿名类的lambda表达式:

匿名类:

 new DialogInterface.OnClickListener()

Lambda表达式:

(dialog, which) -> 

匿名类:

 new MediaPlayer.OnPreparedListener()

Lambda表达式:

mp ->

这不是很酷吗...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接