我们在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表达式替换这些类型的匿名类?
答案 0 :(得分:2)
通过gradle / with external libraries进行一些配置,您可以在Android项目中使用lambda表达式。
要开始使用受支持的Java 8语言功能,请将Android插件更新为3.0.0-alpha1(或更高版本)。
Android Studio不支持所有Java 8语言功能,但在将来的IDE版本中添加了更多功能。根据您使用的minSdkVersion,现在可以使用某些功能和API,如下表所示。
API级别24或更高
进一步阅读:支持的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。这是Java 8的Java 7,6和5的lambda特性的后端。
您可以开始在Kotlin / Lambda's with Kotlin中编写代码。
如需进一步阅读,请nice article how to handle Lambda's
答案 1 :(得分:0)
您只能替换功能接口的匿名类。 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())
请务必记住,启用插孔仍会在编译步骤中生成匿名类。因此,请注意匿名类的所有泄漏。
答案 2 :(得分:0)
我找到了非常好的短代码来转换所有带有lambda表达式的匿名类。这是上面提到的匿名类的lambda表达式:
匿名课程:
new DialogInterface.OnClickListener()
Lambda Expression:
(dialog, which) ->
匿名课程:
new MediaPlayer.OnPreparedListener()
Lambda Expression:
mp ->
不是很酷......