Android中使用Lambda表达式

来源:互联网 发布:php 在线人数统计 编辑:程序博客网 时间:2024/05/24 07:30

      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个示例