Java8新特性之——Lambda表达式

一、简介

Lambda 表达式是 JDK8 引入的一种新的编程语法,用于简化函数式接口的实现。

Lambda 表达式的出现可以取代大多数匿名内部类,写出更简洁优雅的代码。

二、格式

(参数1,参数2) -> {方法体}

三、举例

在 JDK 8 之前,我们创建线程(实际开发推荐用线程池)并启动可以使用匿名内部类的写法:

new Thread(new Runnable() {
    @Override
    public void run() {
        doBusiness();
    }
}).start();

在 JDK 8 之后,我们可以使用 Lambda 表达式的写法:

new Thread(() -> {
    doBusiness();
}).start();

如果方法体里只有一行代码,我们甚至可以省略大括号:

new Thread(() -> doBusiness()).start();

四、使用场景

通过上面的例子,我们可以看到 Lambda 表达式省略了 new Runnable(),这是可以通过 Thread 的方法参数推导出来的,可以理解,但是为什么方法名(run)也可以省略呢,原因就是 Runnable 接口内部只有 run 这一个抽象方法,当接口只有一个抽象方法的时候,实现类必须重写并且只能重写这个方法,所以就不用关心这个方法叫什么名字了,只需要关心方法参数方法体

五、@FunctionalInterface注解

上面我们讲到,当接口只有一个抽象方法,就可以使用 Lambda 表达式来简化这个接口的匿名内部类的写法,所以 JDK 8 还推出了 @FunctionalInterface 注解,用来定义:有且只有一个抽象方法,但是可以有很多个非抽象方法的接口,这个注解标注在接口上,声明接口是函数式接口,且只是在编译期做校验,如果声明多个抽象方法,就会报错,如下:

image-20230824094300484

这样就可以用 Lambda 表达式来声明这个接口的实现,JDK 8 还提供了四大函数式接口,具体可参考我的另一篇文章:Java8新特性之——函数式接口(Function、Consumer、Supplier、Predicate)

六、Lambda表达式的简化方式

省略参数类型:如果上下文已经明确了参数的类型,可以省略参数类型的声明。

@FunctionalInterface
public interface MyInterface {
    String abstractMethod(String param);
}

public class MyTest {

    public static void main(String[] args) {

        // 原本写法
        testMethod((String param) -> {
            return "Hello " + param;
        });

        // 省略参数类型
        testMethod((param) -> {
            return "Hello " + param;
        });
    }

    private static void testMethod(MyInterface m) {
        String str = m.abstractMethod("World");
        System.out.println(str);
    }
}

省略参数括号:如果只有一个参数,可以省略参数的括号。

@FunctionalInterface
public interface MyInterface {
    String abstractMethod(String param);
}

public class MyTest {

    public static void main(String[] args) {

        // 原本写法
        testMethod((param) -> {
            return "Hello " + param;
        });

        // 省略括号
        testMethod(param -> {
            return "Hello " + param;
        });
    }

    private static void testMethod(MyInterface m) {
        String str = m.abstractMethod("World");
        System.out.println(str);
    }
}

省略大括号和return关键字:如果Lambda表达式只有一条语句,并且是返回一个表达式的结果,可以省略大括号和return关键字。

@FunctionalInterface
public interface MyInterface {
    String abstractMethod(String param);
}

public class MyTest {

    public static void main(String[] args) {

        // 原本写法
        testMethod(param -> {
            return "Hello " + param;
        });

        // 省略括号
        testMethod(param -> "Hello " + param);
    }

    private static void testMethod(MyInterface m) {
        String str = m.abstractMethod("World");
        System.out.println(str);
    }
}

方法引用:如果Lambda表达式只是调用一个已存在的方法,可以使用方法引用来代替Lambda表达式

具体可参考我的另一篇文章:Java8新特性之——方法引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天进步亿点点的小码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值