一文搞懂Java8 Lambda表达式(附视频教程)
发布日期:2021-05-07 15:31:36 浏览次数:27 分类:精选文章

本文共 3060 字,大约阅读时间需要 10 分钟。

Lambda表达式介绍

Java 8引入了Lambda表达式,这种新特性极大地简化了代码编写,使程序更加简洁高效。Lambda表达式本质上是一个匿名函数,可以替代传统的匿名内部类,用于实现接口中的抽象方法。

体验Lambda表达式

让我们通过一个简单的例子来感受Lambda表达式的魅力。

传统实现

public class Program {    public static void main(String[] args) {        Cal c1 = new Cal() {            @Override            public int add(int a, int b) {                return a + b;            }        };        int c = c1.add(1, 2);        System.out.println(c);    }}interface Cal {    int add(int a, int b);}

Lambda实现

public class Program {    public static void main(String[] args) {        Cal c1 = (int a, int b) -> {            return a + b;        };        int c = c1.add(1, 2);        System.out.println(c);    }    int add(int a, int b) {        return a + b;    }}interface Cal {    int add(int a, int b);}

简化实现

public class Program {    public static void main(String[] args) {        Cal c1 = (int a, int b) -> a + b;        int c = c1.add(1, 2);        System.out.println(c);    }}interface Cal {    int add(int a, int b);}

通过上述对比可以看出,Lambda表达式的简洁性和强大之处。

Lambda表达式语法

Lambda表达式的基本语法结构为:

(参数列表) -> { 方法体 }
  • 参数列表:用来描述函数接收的输入参数。
  • 方法体:用来描述函数的逻辑实现。
  • Lambda运算符 (->):连接参数列表和方法体,表示函数的定义方式。

语法细节

  • 参数类型可选:可以省略明确写出参数类型。
  • 单个参数可选括号:如果函数只接收一个参数,括号可以省略。
  • 方法体可选大括号:如果方法体只有一条语句,直接写出语句即可,无需使用大括号。
  • 简化返回语句:如果方法体的唯一语句是return语句,可以省略大括号和return关键字。
  • Lambda表达式实例

    以下是实现不同接口的Lambda表达式:

    无参数无返回值

    If1 if1 = () -> System.out.println("无参数无返回值");if1.test();

    单个参数无返回值

    If2 if2 = a -> System.out.println("单个参数无返回值 a=" + a);if2.test(3);

    两个参数无返回值

    If3 if3 = (a, b) -> System.out.println("两个参数无返回值 a+b=" + (a + b));if3.test(2, 3);

    无参数有返回值

    If4 if4 = () -> 100;System.out.println(if4.test());

    单个参数有返回值

    If5 if5 = a -> {    System.out.print("单个参数有返回值 ");    return a;};System.out.println(if5.test(200));

    多个参数有返回值

    If6 if6 = (a, b) -> a + b;System.out.println(if6.test(1, 2));

    方法引用

    在多个Lambda表达式实现同一接口时,可以封装成方法引用,提升代码可维护性。

    静态方法引用

    Program2 program2 = new Program2();If5 if5 = program2::test;If5 if52 = Program2::test2;System.out.println(if5.test(1));System.out.println(if52.test(1));

    构造方法引用

    如果接口的实现恰好可以通过构造函数实现,可以使用构造方法引用。

    Dog dog = new Dog();DogService dogService = Dog::new;DogService2 dogService2 = Dog::new;dogService.getDog();dogService2.getDog("小米", 11);

    @FunctionalInterface注解

    @FunctionalInterface注解用于标识函数式接口(SAM接口)。函数式接口必须具备以下特点:

  • 只有一个抽象方法。
  • 可以包含静态方法和默认方法。
  • 示例

    @FunctionalInterfacepublic interface TestInterface {    void sub();    default void defaultMethod() {}    static void staticMethod() {}}

    错误示例

    @FunctionalInterfacepublic interface TestInterface2 {    void add();    void sub();}

    系统内置函数式接口

    Java 8提供了多个内置函数式接口,主要集中在java.util.function包中。常用接口包括:

    • Consumer
      :用于消费操作,如遍历集合。
    • Comparator
      :用于比较操作。
    • Predicate
      :用于过滤操作。
    • Supplier
      :用于提供结果。

    集合排序与遍历

    List
    list = new ArrayList<>();list.add(new Dog("aa", 1));list.add(new Dog("bb", 4));list.add(new Dog("cc", 3));list.add(new Dog("dd", 2));list.add(new Dog("ee", 5));list.sort((o1, o2) -> o1.getAge() - o2.getAge());System.out.println(list);list.forEach(System.out::println);

    结语

    通过以上内容,可以看到Lambda表达式在Java中具有极大的灵活性和简洁性。它不仅简化了代码编写,还提升了代码的可读性和可维护性。建议通过实践项目来深入掌握Lambda表达式的使用,熟练掌握后,可以显著提升Java编程效率。

    上一篇:Mybatis-Plus通用Mapper CRUD之update
    下一篇:Mybatis-Plus驼峰式命名规则配置

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2025年03月28日 00时51分30秒