可以用 lambda 替换 Listener 是啥意思?

Posted

技术标签:

【中文标题】可以用 lambda 替换 Listener 是啥意思?【英文标题】:What does it mean that a Listener can be replaced with lambda?可以用 lambda 替换 Listener 是什么意思? 【发布时间】:2015-08-25 11:33:18 【问题描述】:

我已经实现了一个AlertDialog,带有正常的负按钮和正按钮点击监听器。

当我打电话给new DialogInterface.OnClickListener() 时,它向我显示了一个建议:Anonymous new DialogInterface.OnClickListener() can be replaced with lambda。我知道这不是一个错误或什么大问题,但这个建议到底是什么,我能做些什么呢?

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setPositiveButton("Text", new DialogInterface.OnClickListener() 
    @Override
    public void onClick(DialogInterface dialog, int which) 
        // do something here
    
);

android Studio V1.2.1.1 compileSdkVersion 22 buildToolsVersion "22.0.0" minSdkVersion 14 targetSdkVersion 22

【问题讨论】:

你能用这个添加你的代码的一部分吗? 你编译的是哪个版本的android? 【参考方案1】:

这意味着你可以缩短你的代码。

onClickListener() 的示例没有 lambda:

mButton.setOnClickListener(new View.OnClickListener() 
    @Override
    public void onClick(View v) 
        // do something here
    
);

可以用 lambda 重写:

mButton.setOnClickListener((View v) -> 
    // do something here
);

这是相同的代码。这在使用大量侦听器或在没有 IDE 的情况下编写代码时很有用。 欲了解更多信息,请查看this。

希望这能回答你的问题。

【讨论】:

请记住 lambda 是 Java 8 的特性,Android 不支持它。如果您喜欢此功能,请使用 retrolambda - github.com/evant/gradle-retrolambda Android 支持@rwojcik Lambda @Strider 如果我想在监听器中添加另一个方法会发生什么?怎么写? Android N 开始支持Java 8,所以Lambda现在正式支持了。 而且你不需要为点击监听器导入“android.view.View”或“android.view.View.OnClickListener”。【参考方案2】:

就这么简单:

button.setOnClickListener(view -> username = textView.getText());

【讨论】:

@M Hornbacher 是的【参考方案3】:

用 lambda 表达式替换经典的新 DialogInterface.OnClickListener() 实现就足够了

 builder.setPositiveButton("resourceId", ((DialogInterface dialog, int which) -> 
      // do something here
 ));

它只是采用 onClick 事件参数。

【讨论】:

以上是关于可以用 lambda 替换 Listener 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

用 cloudformation 替换 terraform 部署的 lambda

java的listener是啥原理

oracle的监听器listener 和 java web的监听器listener 的联系是啥?

通过用向量化替换 lambda x 来提高排名函数的性能

返回模板 lambda 函数的正确方法是啥?

Lambda+Stream替换集合中每个对象的指定字段值