好炫的Lambda表达式,Java党用起来!(最简易Lambda教程)

刷微博时偶然看到 Lambda 的 HelloWorld 教程,觉得很酷炫!分享一下!

效果示例

总体看起来效果就是代码简洁,如下

//之前的写法
btn.setOnClickListener(new View.OnClickListener() {
     @Override
      public void onClick(View v) {
          System.out.println("hello lambda");
          ...
      }
});

//Lambda表达式写法
btn.setsetOnClickListener((View v) -> {
          System.out.println("hello lambda");
          ...
      }
);
//之前的写法
new Thread(new Runnable() {
    @Override
     public void run() {
         System.out.println("hello lambda");
     }
}).start();

//Lambda表达式写法(只有一行内容可以去掉代码块大括号)
new Thread(() -> System.out.println("hello lambda")).start();

Lambda表达式模板

(T args) -> {
    //代码块
}

一个lambda expression由三部分组成:
- 参数:(T args)是这个lambda expression的参数部分,包括参数类型和参数名,可为空,小括号不可缺少
- 箭头:->,不可缺少
- 代码块:就是用”{}”包含着的代码。当代码块内代码只有一行时,花括号可以省略,且代码块内分号省略

原理

Lambda表达式不是新语法,是一种精简的字面写法,其实就是程序员可以把匿名内部类中“一定”要做的工作省略掉,然后由JVM通过推导把简化的表达式还原。

分步讲解

//对比两个学生的年龄
public void sort(Student[] students) {
    Arrays.sort(students, new Comparator<Student>() {
        @Override
        public int compare(Student stu1, Student stu2) {
            return Integer.compare(stu1.age, stu2.age);
        }
    });
}

如上例子,第二个参数“一定”要为new Comparator<T>(){}类型,那么可以先去掉这第一个“一定”

//对比两个学生的年龄
public void sort(Student[] students) {
    Arrays.sort(students,
        @Override
        public int compare(Student stu1, Student stu2) {
            return Integer.compare(stu1.age, stu2.age);
        }
    );
}

new Comparator<T>(){}里面“一定”要重写compare方法,并且“一定”返回int类型,那么方法名称也可以去掉

//对比两个学生的年龄
public void sort(Student[] students) {
    Arrays.sort(students,
        (Student stu1, Student stu2) {
            return Integer.compare(stu1.age, stu2.age);
        }
    );
}

这个时候还是会报错,我们在参数列表和代码块之间加上箭头(->)就构成完整的Lambda表达式就能编译通过了。

//对比两个学生的年龄
public void sort(Student[] students) {
    Arrays.sort(students,
        (Student stu1, Student stu2) -> {
            return Integer.compare(stu1.age, stu2.age);
        }
    );
}

如果代码块中只有一行代码的话,可以把大括号去掉,同时return去掉(因为compare方法一定返回int),而且这一行的最后的分号去掉。并且多余的空行可以合并为一行。

//对比两个学生的年龄
public void sort(Student[] students) {
    Arrays.sort(students, (Student stu1, Student stu2) -> Integer.compare(stu1.age, stu2.age));
}

compare方法的参数列表中的参数类型“一定”是Arrays.sort()方法中第一个参数的类型,所以可以省略,因为JVM能够帮我们推导出来。

//对比两个学生的年龄
public void sort(Student[] students) {
    Arrays.sort(students, (stu1, stu2) -> Integer.compare(stu1.age, stu2.age));
}

简化完成!现在再来对比一下简化后和简化前的代码,你们感受一下

//对比两个学生的年龄
public void sort(Student[] students) {
    //简化前
    Arrays.sort(students, new Comparator<Student>() {
        @Override
        public int compare(Student stu1, Student stu2) {
            return Integer.compare(stu1.age, stu2.age);
        }
    });
    //简化后
    Arrays.sort(students, (stu1, stu2) -> Integer.compare(stu1.age, stu2.age));
}

其他效果

Lambda表达式也可以用于赋值。

Runnable r = () -> System.out.println("hello lambda");
new Thread(r).start();

Lambda使用限定

简单来说,下载最新的Eclipse就能支持Lambda语法。

我是Android党,Java 8以上才支持Lambda表达式,而Android最新只支持Java 7,如果Android中想使用的话,使用gradle-retrolambda插件。


最后还是推荐大家去看视频:《 Lambda 的 HelloWorld 视频教程》

Reference:
《 Lambda 的 HelloWorld 视频教程》
《Java 8的Lambda及其在Android 开发中的应用》
《如何在Android编程中使用Lambda表达式》

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值