java -- Lambda表达式详细介绍

发布于:2024-08-01 ⋅ 阅读:(124) ⋅ 点赞:(0)

java中的Lambda表达式是Java 8引入的一个重要特性,它提供了一种清晰且简洁的方式来表示单个方法的接口(也被称为函数式接口)的实例。Lambda表达式使得编写匿名内部类(尤其是那些仅实现了一个方法的接口)变得更加简洁和易于理解。

基本语法

Lambda表达式的基本语法如下:

(parameters) -> expression

或者对于包含多条语句的情况:

(parameters) -> { statements; }
  • parameters:参数列表。参数的类型可以省略(称为类型推断),但如果有多个参数,则必须用小括号括起来。
  • ->:Lambda操作符,将参数列表与Lambda体分隔开。
  • expression/statements:Lambda体,可以是单个表达式(该表达式的计算结果会自动返回),也可以是一个代码块(需要显式地使用return语句返回结果,如果方法签名指定了返回类型的话)。
public class Demo01Lambda {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("我执行了");
            }
        }).start();

        System.out.println("============");
        
        new Thread(()-> System.out.println("我执行了")).start();

        ArrayList<String> list = new ArrayList<>();
    }
}

Lambda表达式的编写步骤

  1. 识别函数式接口:首先,观察是否有函数式接口作为方法的参数进行传递。函数式接口是只包含一个抽象方法的接口(可以使用@FunctionalInterface注解进行标记,但这不是强制的)。
  2. 考虑使用Lambda表达式:如果确认参数是函数式接口,那么可以考虑使用Lambda表达式来简化代码。Lambda表达式提供了一种简洁的方式来实现这个接口。
  3. 转换匿名内部类:原本可能需要通过匿名内部类来传递实参给方法,现在可以使用Lambda表达式来替代。首先,定位到匿名内部类的声明处(从new 接口名()开始到重写的方法体结束)。
  4. 删除不必要的部分:选中整个匿名内部类的代码块,除了重写的方法体内容外,删除new 接口名()、接口名、方法名后的括号、以及方法的返回类型声明(如果Lambda表达式能够通过上下文推断出返回类型)。不要忘记最后删除一个多余的右大括号。
  5. 添加Lambda操作符:在保留的参数列表和方法体之间,插入Lambda操作符->。这标志着Lambda表达式的开始。

Lambda表达式的省略规则(优化表述)

  1. 参数类型省略:在Lambda表达式中,如果编译器能够根据上下文推断出参数的类型,那么可以省略参数的类型声明。
  2. 单参数小括号省略:如果Lambda表达式只接受一个参数,那么包围该参数的小括号可以省略,但参数名仍需保留。
  3. 单语句大括号和分号省略:如果Lambda表达式的方法体只包含一条语句,那么可以省略方法体的大括号和分号。此时,如果这条语句是一个表达式,其值将作为Lambda表达式的返回值。
  4. 返回值省略:如果Lambda表达式的方法体只有一条返回语句,并且该语句的返回值类型与Lambda表达式声明的返回类型兼容,那么可以省略return关键字以及该语句后的分号。Lambda表达式将自动返回该表达式的值。

案列

定义一个类

public class Person {
   private String name;
   private Integer age;

    public Person() {
    }

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

定义实现类 , 写 Lambda表达式

public class Demo03Lambda {
    public static void main(String[] args) {
        ArrayList<Person> list = new ArrayList<>();
        list.add(new Person("张三",10));
        list.add(new Person("李四",8));
        list.add(new Person("王五",9));

       /* Collections.sort(list, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getAge()-o2.getAge();
            }
        });
*/
        System.out.println("=============Lambda==========");

      /*  Collections.sort(list,(Person o1, Person o2)-> {
                return o1.getAge()-o2.getAge();
        });*/

        System.out.println("===========Lambda表达式简化形式==========");

        Collections.sort(list,(o1, o2)-> o1.getAge()-o2.getAge());
        System.out.println(list);
    }
}

网站公告

今日签到

点亮在社区的每一天
去签到