美文网首页
Java8特性学习笔记(一) Lambda

Java8特性学习笔记(一) Lambda

作者: 简单一点点 | 来源:发表于2021-12-23 18:22 被阅读0次

介绍一下Java 8中新增的特性,这些特性平时不用也不影响编码,但是如果用上了会大大提高编程效率,同时让人感觉你很professional。

主要参考以下两个项目:

Lambda表达式

先看一个降序排列字符串的例子,传统写法:

List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");

Collections.sort(names, new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return b.compareTo(a);
    }
});

只需要给静态方法 Collections.sort 传入一个 List 对象以及一个比较器来按指定顺序排列。通常做法都是创建一个匿名的比较器对象然后将其传递给 sort 方法。

Java8中使用 lambda 表达式:

Collections.sort(names, (String a, String b) -> {
    return b.compareTo(a);
});

对于函数体只有一行代码的,你可以去掉大括号{}以及 return 关键字,让它再次简短:

Collections.sort(names, (String a, String b) -> b.compareTo(a));

List 类本身就有一个 sort 方法。并且Java编译器可以自动推导出参数类型,所以你可以不用再写一次类型。这样可以更加简短:

names.sort((a, b) -> b.compareTo(a));

Lambda表达式作用域

本部分讨论 lambda 表达式访问外部变量的作用域。

访问局部变量

lambda 表达式支持访问局部变量,而且不需要像匿名函数一样将变量声明为final

int num = 1;
Function<Integer, Integer> add = a -> (a + num);
System.out.println(add.apply(111)); // 112

不过这个局部变量必须不可被后面的代码修改(即隐性的具有 final 的语义),例如下面的就无法编译:

int num = 1;
Function<Integer, Integer> add = a -> (a + num);
System.out.println(add.apply(111)); // 112
num = 2;

访问字段和静态变量

与局部变量相比,我们对 lambda 表达式中的实例字段和静态变量都有读写访问权限。 该行为和匿名对象是一致的。

public class App {
    static int num = 1;
    public static void main(String[] args) {
        Function<Integer, Integer> add = a -> (a + num);
        System.out.println(add.apply(111)); // 112
        num = 2;
        System.out.println(num); // 2
    }
}

访问默认接口方法

lambda 表达式无法访问默认接口方法。

相关文章

网友评论

      本文标题:Java8特性学习笔记(一) Lambda

      本文链接:https://www.haomeiwen.com/subject/yzxkqrtx.html