Java8的Lambda表达式你了解吗?

五一5天假,说没就没,可是学习的脚本不能停下。 express

收假了,咱们仍是要继续搬砖,学习也不能携带。 markdown

给你们带来一套Java8的秘籍。 ide

Lambda 表达式是什么

Lambda 表达式(lambda expression)是一个匿名函数,由数学中的 λ 演算而得名。 在 Java 8 中能够把 Lambda 表达式理解为匿名函数,它没有名称,可是有参数列表、函数主体、返回类型等。 函数

Lambda 表达式的语法以下: 学习

(parameters) -> { statements; } spa

为何要使用 Lambda 表达式? 前面你也看到了,在 Java 中使用内部类显得十分冗长,要编写不少样板代码,Lambda 表达式正是为了简化这些步骤出现的,它使代码变得清晰易懂。 code

如何使用 Lambda 表达式

Lambda 表达式是为了简化内部类的,你能够把它当成是内部类的一种简写方式,只要是有内部类的代码块,均可以转化成 Lambda 表达式: orm

// Comparator排序 
List<Integer> list = Arrays.asList(31452);
list.sort(new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1.compareTo(o2);
    }
});

// 使用Lambda表达式简化
list.sort((o1, o2) -> o1.compareTo(o2));
复制代码
// Runnable代码块 
Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello Man!");
    }
});

// 使用Lambda表达式简化
Thread thread = new Thread(() -> System.out.println("Hello Man!"));
复制代码

能够看出,只要是内部类的代码块,就能够使用 Lambda 表达式简化,而且简化后的代码清晰易懂。 排序

方法引用

甚至,Comparator 排序的 Lambda 表达式还能够进一步简化: 数学

list.sort(Integer::compareTo);

这种写法被称为 「方法引用」,方法引用是 Lambda 表达式的简便写法。 若是你的 Lambda 表达式只是调用这个方法,最好使用名称调用,而不是描述如何调用,这样能够提升代码的可读性。

方法引用使用 ::分隔符,分隔符的前半部分表示引用类型,后面半部分表示引用的方法名称。 例如: Integer::compareTo表示引用类型为 Integer,引用名称为 compareTo的方法。

对于 Lambda 表达式到方法引用的简化,咱们提供如下规则:

Lambda 表达式 方法引用
(args) -> ClassName.staticMethod(args) ClassName::staticMethod
(arg0, ...) -> arg0.instanceMethod(...) ClassName::instanceMethod
(args) -> expression.instanceMethod(args) expression::instanceMethod

特别的,对于构造函数的方法引用: ClassName::new

相似使用方法引用的例子还有打印集合中的元素到控制台中: list.forEach(System.out::println);


求关注、分享、在看! ! !  你的支持是我创做最大的动力。