Android中使用Lambda表达式

      Lambda ,如果不知道怎么读,那λ怎么读吧,它是Java1.8 新增的特性,详细介绍请看这里:Java 8简明教程

     lambda表达式取代了匿名内部类,取消了模板,允许程序猿用函数式风格编写代码,使代码可读性更高,尽管刚开始你会看不懂,但是你应该尝试,毕竟这是新的东西,我已从中获益。

    

格式

基本格式是:() -> {}

有下面三种具体表达:

  1. (params) -> expression
  2. (params) -> statement
  3. (params) -> {statement}

这个新的特性是激动人心的,那么有个问题,怎么用,是啊,很多东西我们都懂,但为什么还是过不好这一生,说远了,问题的关键是:用,得用,你还得会用。

lambda使用举例


as里的配置

要使用lambda,首先必须配置编译环境,这里使用的android studio,as默认的jdk版本是1.6,修改成1.8即可使用,这里确保你系统安装了jdk1.8,否则需要用到下面插件:gradle-retrolambda

as里的配置有两种方法:

配置gradle脚本

在build.gradle脚本中添加下列代码:

android {
   compileOptions {
       sourceCompatibility 1.8
       targetCompatibility 1.8
   }
}

当然写成下面的样子也是可以的

android {
   compileOptions {
       sourceCompatibility JavaVersion.VERSION_1_8
       targetCompatibility JavaVersion.VERSION_1_8
   }
}

设置项目结构

按快捷键Ctrl+Shift+Alt+S进入项目结构设置,把app的jdk版本修改成1.8,注意你需要填写1.8,因为那个下拉菜单里没有这一选项,如下:


1

这里采用的是第二种方法,然后项目自动同步。

同步后是会在build.gradle脚本下生成和上面一样的东东:


2

举例

点击按钮触发事件

传统的点击事件,应用匿名内部类:

Button button = (Button) findViewById(R.id.btn_insert);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(MainActivity.this, "hello", Toast.LENGTH_LONG).show();
        }
    });

通过上面设置jdk版本为1.8后,鼠标放到new View.OnClickListener()里会有下面提示:


3

然后我们按快捷键Alt+Enter,是这样的


4

继续回车后,见证奇迹的时刻到来lo。。。

使用lambda表达式之后是这样的

Button button = (Button) findViewById(R.id.btn_insert);
button.setOnClickListener(v -> Toast.makeText(MainActivity.this, "hello", Toast.LENGTH_LONG).show());

一行代码就搞定了,清晰可见,把行为传到了函数里,这里注意v不可省略,是函数onClick的参数,当然就可以是任意名字,我还是建议就用一个字母表示,简单嘛,当然了首先你得知道她的意思,尽管她的很多行为你始终不会明白,哈哈。

实现Runnable接口

传统实现Runnable接口是这样的:

new Thread(new Runnable() {
    @Override
    public void run() {
        Log.i("TAG", "haha");
    }
}).start();

使用lambda表达式之后是这样的:

new Thread(() -> {
    Log.i("TAG", "haha");
}).start();

哇哦,是不是有种很清爽的感觉,乍一看,这是什么鬼,仔细分析后是用了lambda表达式() -> {},哈哈,简单的爱,这是程序员懒惰的一种体现,可以写出更简洁高校的代码,赞一个。

比较

既然lambda表达式即将正式取代Java代码中的匿名内部类,那么有必要对二者做一个比较分析。

第一个关键的不同点就是关键字 this。匿名类的 this 关键字指向匿名类,而lambda表达式的 this 关键字指向包围lambda表达式的类。

第二是编译方式。Java编译器将lambda表达式编译成类的私有方法。使用了Java 7的 invokedynamic 字节码指令来动态绑定这个方法。

总结

lambda表达式还有很多用法,比如迭代器,详细用法请参考这里:Java8 lambda表达式10个示例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值