欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java8(一)Lambda表达式

程序员文章站 2022-05-05 08:55:39
...

  前言

Lambda的作用:简化函数式接口的使用 (@FunctionalInterface 接口中只能有一个抽象方法)。
Lambda表达式的基本语法: 参数列表 -> 表达式。

 使用

下面让我们来对比一下使用和没使用Lambda表达式到差别。

后面代码要用到的基础类:

@[email protected]@ToString
public class User {

    private String name;

    private Integer score;

    public User(String name, Integer score) {
        this.name = name;
        this.score = score;
    }
}

没有使用Lambda前:

@Test
    public void testOldUse1() {

        User[] us = new User[]{new User("张三", 80),
                new User("李四", 90),
                new User("王五", 100)};

        Arrays.sort(us, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                return o1.getScore() - o2.getScore();
            }
        });

        System.out.println(Arrays.toString(us));

    }

使用Lamba后:

    @Test
    public void testNewUse1() {

        User[] us = new User[]{new User("张三", 80),
                new User("李四", 90),
                new User("王五", 100)};
        //进化1 : 不用写接口名和方法名,编译器会自动推导能够推导出来的东西
        Arrays.sort(us, (User o1, User o2) -> {
            return o1.getScore() - o2.getScore();
        });

        //进化2: 参数列表中的参数类型可以省略
        Arrays.sort(us, (o1, o2) -> {
            return o1.getScore() - o2.getScore();
        });
        //(特例:参数类型如果有final修饰,不能省略参数类型)
        Arrays.sort(us, (final User o1, final User o2) -> {
            return o1.getScore() - o2.getScore();
        });

        //进化3: 如果方法体只有一行代码,可以省略花括号,  如果有返回值,编译器会自动帮我们推导return
        Arrays.sort(us, (o1, o2) -> o1.getScore() - o2.getScore());

        //进化4: 方法引用
        Integer[] is = new Integer[]{1, 3, 2, 4, 5, 8};
        Arrays.sort(is, (x, y) -> Integer.compare(x, y));
        //参数列表的值原原本本传递给方法体中的方法时,可以用方法引用的方式来书写
        Arrays.sort(is, Integer::compare);
        System.out.println("is = " + Arrays.toString(is));

        //5.其他细节
        //(不常用,了解即可)如果只有一个参数,并且写了参数类型,那么参数列表不可以省略括号
        Arrays.stream(is).forEach((Integer x) -> System.out.println(x));

        //如果只有一个参数,并且参数类型不写,那么参数列表可以省略括号
        Arrays.stream(is).forEach(x -> System.out.println(x));
        //更进一步
        Arrays.stream(is).forEach(System.out::println);

        System.out.println(Arrays.toString(us));

    }

代码中详细描写了Lambda表达式的进化过程。建议把代码copy去自己的IDEA运行一下。