java8(一)Lambda表达式

  前言

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

 使用

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

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

@Getter@Setter@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运行一下。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值