1.Lambda表达式的写法

a. 举例: (o1, o2) -> Integer.compare(o1, o2);
b. 格式:
-> : Lambda操作符 或 箭头操作符
->左边: 指定了Lambda表达式需要的参数列表
->右边: 指定了Lambda体,是抽象方法的实现逻辑, 也即Lambda表达式要执行的功能.
c. Lambda表达式的使用: (分为6种 情况介绍)
省略写法:
->左边: lambda形参列表的参数类型可以省略(类型推断); 如果只有一个参数,小括号()也可以省略
->右边: lambda体应该使用一对{}包裹; 但如果lambda体只有一条执行语句,{}也可以省略

d. Lambda表达式的本质: 作为函数式接口的实例
e. 如果一个接口中, 只声明了一个抽象方法, 则此接口就称为函数式接口

语法格式一: 无参, 无返回参数

  1. public class LambdaTest {
  2. public static void test1() {
  3. //传统方式
  4. Runnable r1 = new Runnable() {
  5. @Override
  6. public void run() {
  7. System.out.println("test1");
  8. }
  9. };
  10. r1.run();
  11. //--------------------------------------
  12. //Lambda方式
  13. Runnable r2 = () -> System.out.println("test1");
  14. r2.run();
  15. }
  16. }

语法格式二: Lambda需要一个参数,但是没有返回值

public static void test2(){
    //传统方式
    Consumer<String> con1 = new Consumer<String>(){
        @Override
        public void accept(String s){
            System.out.println(s);
        }
    };
    con1.accept("test2");

    //--------------------------------------
    //Lambda方式
    Consumer<String> con2 = (String s) -> {
        System.out.println(s);
    };
    con2.accept("test2");
}

语法格式三: 数据类型可以省略, 因为可由编译器推断得出, 称为”类型推断”

public static void test(){
    //传统方式
    Consumer<String> con1 = new Consumer<String>(){
        @Override
        public void accept(String s){
            System.out.println(s);
        }
    };
    con1.accept("test3");

    //--------------------------------------
    //Lambda方式
    Consumer<String> con2 = (s) -> {
        System.out.println(s);
    };
    ArrayList<String> list = new ArrayList<>();//类型推断
}

语法格式四: Lambda如果只需要一个参数时, 参数的小括号也可以省略

    public static void test4(){
        //传统方式
        Consumer<String> con1 = new Consumer<String>(){
            @Override
            public void accept(String s){
                System.out.println(s);
            }
        };
        con1.accept("test2");

        //--------------------------------------
        //Lambda方式
        Consumer<String> con2 = s -> {
            System.out.println(s);
        };
        con2.accept("test2");
    }

语法格式五: Lambda需要两个或以上的参数, 多条执行语句,并且可以有返回值

    public static void test5() {
        //传统方式
        Comparator<Integer> com1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println(o1);
                System.out.println(o2);
                return o1.compareTo(02);
            }
        };
        System.out.println(com1.compare(11,22));
        //-------------------------------
        //Lambda方式
        Comparator<Integer> com2 = (o1,o2) -> {
            System.out.println(o1);
            System.out.println(o2);
            return o1.compareTo(o2);
        };
        System.out.println(com2.compare(11,22));
    }

语法格式六: 当Lambda体只有一条语句时, return 与大括号都可以省略

public static void test6() {
    //Lambda方式 
    Comparator<Integer> com1 = (o1,o2) -> {
        System.out.println(o1);
        System.out.println(o2);
        return o1.compareTo(o2);
    };
    System.out.println(com1.compare(11,22));
    //-------------------------------
    //Lambda方式 
    Comparator<Integer> com2 = (o1,o2) -> o1.compareTo(o2);
    System.out.println(com2.compare(11,22));
}