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

时间:2017-01-09 17:51:05

标签: android lambda java-8

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

In [251]: df['col2']=x
In [252]: df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1000 entries, 0 to 999
Data columns (total 2 columns):
MyCol    1000 non-null float64
col2     1000 non-null float64
dtypes: float64(2)
memory usage: 23.4 KB

In [253]: x.nbytes
Out[253]: 8000

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

3 个答案:

答案 0 :(得分:2)

通过gradle / with external libraries进行一些配置,您可以在Android项目中使用lambda表达式。

开箱即用的Java 8语言功能

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

  

Android Studio不支持所有Java 8语言功能,但在将来的IDE版本中添加了更多功能。根据您使用的minSdkVersion,现在可以使用某些功能和API,如下表所示。

  • Lambda表达式Any。
  • 方法参考任何。
  • 类型注释任何。
  • 默认和静态接口方法Any。
  • 重复注释任何。

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

适用于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 7,6和5的lambda特性的后端。

科特林

您可以开始在Kotlin / Lambda's with Kotlin中编写代码。

如需进一步阅读,请nice article how to handle Lambda's

答案 1 :(得分:0)

您只能替换功能接口的匿名类。 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();
        }
    });
    
  3.  mView.setOnClickListener(view -> onSomethingClicked())
    

    请务必记住,启用插孔仍会在编译步骤中生成匿名类。因此,请注意匿名类的所有泄漏。

答案 2 :(得分:0)

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

匿名课程:

 new DialogInterface.OnClickListener()

Lambda Expression:

(dialog, which) -> 

匿名课程:

 new MediaPlayer.OnPreparedListener()

Lambda Expression:

mp ->

不是很酷......