Java8新特性lambda学习

Lambda表达式

Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
本质: 作为函数式接口的实例, 没有接口就没意义了.

    // 简单使用举例
    @Test
    public void test1(){
        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("r1 is running...");
            }
        };
        r1.run();
        // lambda写法
        Runnable r2 = () -> System.out.println("r2 is running...");
        r2.run();
    }

    @Test
    public void test2(){
        Comparator<Integer> intcmp = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1, o2);
            }
        };
        System.out.println(intcmp.compare(1, 2));
        Comparator<Integer> intcmp2 = Integer::compare; // 方法引用
        // 和intcmp2等价, 但lambda
        Comparator<Integer> intcmp3 = (Integer o1, Integer o2) -> Integer.compare(o1,o2);
        // 和intcmp2等价, 但lambda
        Comparator<Integer> intcmp4 = (o1, o2) -> Integer.compare(o1,o2);
        System.out.println(intcmp2.compare(2, 1));
        System.out.println(intcmp3.compare(2, 1));
        System.out.println(intcmp4.compare(2, 1));
    }

这两个代码片段分别创建了匿名内部类的实例,分别用于实现Comparator<Integer>接口和Runnable接口。
当接口只有一个抽象方法时(函数式接口)用lambda改写会更简洁. 在实际开发中,通常更倾向于使用Lambda 表达式,因为它使代码更简洁且易读。

操作符解释以及lambda的6种语法格式

-> : lambda操作符
-> 左边: lambda形参列表, 其实就是接口中的抽象方法中的形参列表
-> 右边: lambda体, 其实就是重写的抽象方法的方法体

语法格式一: 无参, 无返回值

Runnable r2 = () -> System.out.println("r2 is running...");

语法格式二: 一个参数, 无返回值

Consumer<String> cons2 = (String s) -> System.out.println(s);
cons2.accept("cons2");

语法格式三: 数据类型可以省略, 因为可由编译器推断得出, 称为'类型推断'

Comparator<Integer> intcmp4 = (o1, o2) -> Integer.compare(o1,o2);
Consumer<String> cons2 = (s) -> System.out.println(s);

语法格式四: lambda若只需要一个参数, 参数的小括号可以省略

Consumer<String> cons2 = s -> {System.out.println(s);};

语法格式五: lambda需要两个或以上的参数, 多条执行语句, 并且可以有返回值

Comparator<Integer> intcmp5 = (o1, o2) -> {
    System.out.println("intcomp5");
    return Integer.compare(o1, o2);
};
System.out.println(intcmp5.compare(2, 3));

语法格式六: lambda只有一条语句, return与大括号若有, 都可以省略

Comparator<Integer> intcmp4 = (o1, o2) -> Integer.compare(o1,o2);

总结

-> 左边: lambda形参列表的参数类型可以省略(因为有类型推断); 如果lambda形参列表只有一个参数, 括号()也可以省略;
-> 右边: lambda体应该用一对{}包裹; 如果lambda体只有一条执行语句(可能是return 语句), 可以省略这一对{}和return关键字.

热门相关:开局签到荒古圣体   覆汉   黜龙   至尊剑皇   开局签到荒古圣体