Java8 Lambda 表达式学习

97 阅读2分钟

Java 8 Lambda表达式

 @Test
    public void test2() {
        Comparator<Integer> com1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1, o2);
            }
        };
        int compare1 = com1.compare(1, 2);
        System.out.println(compare1);

        System.out.println("**************************");
        //lambda表达式写法
        Comparator<Integer> com2 = (o1, o2) -> Integer.compare(o1, o2);
        int compare2 = com2.compare(-1, 2);
        System.out.println(compare2);

        System.out.println("**************************");
        //方法引用
        Comparator<Integer> com3 = Integer::compare;
        int compare3 = com3.compare(15, 2);
        System.out.println(compare3);

    }

# Lambda表达式的使用:

1.例子:
 Comparator<Integer> com2 = (o1, o2) -> Integer.compare(o1, o2);
2.格式:
  1. ​ -> Lambda操作符,或者箭头操作符
  2. ​ -> 左边:形参列表(其实就是接口中抽象方法的形参列表)
  3. ​ -> 右边: lambda体 其实就是抽象方法的方法体
3.表达式的使用(一共有6种情况):
  1. 语法格式一:无参,无返回值
@Test
 public void test1() {
     Runnable r1 = new Runnable() {
         @Override
         public void run() {
             System.out.println("我今天吃红烧肉");
         }
     };
     r1.run();
     System.out.println("**************************");

     Runnable r2 = () -> System.out.println("我今天吃饺子");

     r2.run();
 }
  1. 语法格式二:Lambda形参需要一个参数,但是没有返回值

    @Test
    public void test3() {
       Consumer<String> com = new Consumer<String>() {
           @Override
           public void accept(String s) {
               System.out.println(s);
           }
       };
       com.accept("今天我要吃饺子");
    
       System.out.println("**************************");
    
       Consumer<String> com1 = (String s) -> {
           System.out.println(s);
       };
       com1.accept("今天吃包子");
    
    }
    
  2. 语法格式三:数据类型可以省略,因为可以由编译器推断得出,称为"类型推断"

      Consumer<String> com1 = (String s) -> {
            System.out.println(s);
        };
        com1.accept("今天吃包子");
    
     System.out.println("**************************");
    
       Consumer<String> com2 = (s) -> {
            System.out.println(s);
        };
        com2.accept("今天吃豆包");
    

    因为前面泛型定义了String类型,所以参数后面就会被编译器推断出类型,所以可以省略

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

      Consumer<String> com2 = (s) -> {
            System.out.println(s);
        };
        com2.accept("今天吃豆包");
    
    System.out.println("**************************");
    
      Consumer<String> com3 = s -> {
            System.out.println(s);
        };
        com2.accept("今天吃牛肉包");
    
  4. 语法格式五:Lambda 需要两个或以上的参数,多条执行语句,且可以有返回值或者没有返回值

    @Test
    public void test4() {
        Comparator<Integer> com1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println(o1);
                System.out.println(o2);
                return Integer.compare(o1, o2);
            }
        };
        int compare1 = com1.compare(1, 2);
        System.out.println(compare1);
    
        System.out.println("**************************");
    
        //lambda表达式写法
        Comparator<Integer> com2 = (o1, o2) -> {
            System.out.println(o1);
            System.out.println(o2);
            return Integer.compare(o1, o2);
        };
        int compare2 = com2.compare(-1, 2);
        System.out.println(compare2);
    
    
    }
    
  5. 语法格式六:当Lambda体只有一条语句时,return与大括号(若有),都可以省略

    @Test
    public void test5() {
    
        Comparator<Integer> com = (o1, o2) -> {
            return Integer.compare(o1, o2);
        };
        int compare = com.compare(-1, 2);
    
        System.out.println("**************************");
    
        Comparator<Integer> com1 = (o1, o2) -> Integer.compare(o1, o2);
        int compare1 = com.compare(-1, 20);
    
    
    }
    

lambda表达式的本质,是作为接口的实例,所以这个类只能有一个方法,它依赖于函数式接口

总结:

左边:Lambda形参列表类型可以省略,如果lambda形参列表只有一个参数,括号可以省略

右边:lambda体应该使用{} 包裹;如果lambda体只有一条语句(可能是return语句),那么可以省略这一对{}和return 关键字,要么大括号{}不省略,