java8新特性-Lambda表达式

时间:2022-03-04 18:47:28

  前文介绍了java8得一些新特性,与优点,也是为本次学习java8新特性制定一个学习的方向,后面几篇会根据上文中得新特性一一展开学习。本文就从java8新特性中比较重要的Lambda表达式开始学习。

首先:为什么要使用lambda表达式?

  Lambda是一个匿名函数,我们可以baLambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁,更灵活的代码。作为一种更紧凑得代码风格,使得java得语言表达能力得到提升。

一、Lambda 表达式的基础语法:

  Java8中引入了一个新的操作符 "->" 该操作符称为箭头操作符或 Lambda 操作符箭头操作符将 Lambda 表达式拆分成两部分:
  左侧:Lambda 表达式的参数列表
  右侧:Lambda 表达式中所需执行的功能, 即 Lambda 体

  1. 语法格式一:无参数,无返回值   ———— () -> System.out.println("Hello Lambda!");
        @Test
        public void test1(){
            int num = 0;//jdk 1.7 前,必须是 final
            //java8之前写法
            Runnable r = new Runnable() {
                @Override
                public void run() {
                    System.out.println("Hello World!" + num);
                }
            };
            r.run();
            System.out.println("---------使用lambda以后----------");
            Runnable r1 = () -> System.out.println("Hello Lambda!");
            r1.run();
        }

     

  2. 语法格式二:有一个参数,并且无返回值 ———— (x) -> System.out.println(x);
  3.     @Test
        public void test2(){
            Consumer<String> con = (x) -> System.out.println(x);
            con.accept("Lambda威武!");
        }

     

  4. 语法格式三:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句
        @Test
        public void test3(){
            Comparator<Integer> com = (x, y) -> {
                System.out.println("函数式接口");
                return Integer.compare(x, y);
            };
        }

     

  5. 语法格式四:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写 —— Comparator<Integer> com = (x, y) -> Integer.compare(x, y);

        @Test
        public void test4(){
            Comparator<Integer> com = (Integer x, Integer y) -> Integer.compare(x, y);
        }

     

  6. 语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断” —— (Integer x, Integer y) -> Integer.compare(x, y);

        @Test
        public void test4(){
            Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
        }

    二、Lambda 表达式需要“函数式接口”的支持

  

  1.  函数式接口:接口中只有一个抽象方法的接口,称为函数式接口。 可以使用注解 @FunctionalInterface 修饰  可以检查是否是函数式接口
     @FunctionalInterface
     public interface myLambdaModle<T> {
     
         public int getValue(T t2);
         
     }
  2. 需求:对两数进行运算
    //需求:对一个数进行运算
        @Test
        public void test6(){
            Integer num = operation(100, (x) -> x * x);
            System.out.println(num);
            
            System.out.println(operation(200, (y) -> y + 200));
        }
        
        public Integer operation(Integer num, myLambdaModle my){ 

    return mf.getValue(num);
       }