zoukankan      html  css  js  c++  java
  • java8新特性——Lambda表达式

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

    一、为什么要使用Lambda表达式

      Lambda是一个匿名函数,我们可以baLambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁,更灵活的代码。作为一种更紧凑得代码风格,使得java得语言表达能力得到提升。Lambda表达式需要函数式接口的支持,接口中只有一个抽象方法得接口叫做函数式接口。可以使用@FunctionalInterface修饰,可以检查是否是函数式接口。

    二、Lambda表达式基础语法

      java8中新增了一个操作符,“->”箭头表达式,也叫Lambda操作符。Lambda表达式左侧为Lambda表达式得参数列表,右侧为操作步骤与逻辑,也叫做Lambda体。Lambda表达式有几种语法格式,下面就来一一学习。

      1. 无参数,无返回值(()-> 接口得功能)。

     1 /**
     2      * 
     3      * 语法一:无参数,无返回值(()-> 执行的代码)
     4      */
     5     @Test
     6     public void test1() {
     7         //java8实现Runnable方法
     8         Runnable run = () -> System.out.println("Hello Lambda");
     9         run.run();
    10         
    11         //java8以前得写法
    12         Runnable run1 = new Runnable() {
    13             
    14             @Override
    15             public void run() {
    16                 System.out.println("Hello World");
    17             }
    18         };
    19         run1.run();
    20     }

      其中需要注意得是,在java1.7以前,在匿名内部类中使用同级别得得局部变量时,这个局部变量必须时final类型得,但是在java8以后,局部变量不用final修饰了,final可以省略,但是其类型还是默认为final类型的。

      2.一个参数,无返回值

    1     /**
    2      * 语法二:一个参数,无返回值
    3      */
    4     @Test
    5     public void test2() {
    6         Consumer<String> t = (x) -> System.out.println(x);
    7         t.accept("Hello Lambda");
    8     }

      注意,如果只有一个参数,小括号可以不写。

    1     /**
    2      * 语法二:一个参数,无返回值
    3      */
    4     @Test
    5     public void test2() {
    6         Consumer<String> t = x -> System.out.println(x);
    7         t.accept("Hello Lambda");
    8     }

      3. 多个参数,多条语句,有返回值。

     1     /**
     2      * 语法三:多个参数,多条语句,有返回值。
     3      */
     4     @Test
     5     public void test3() {
     6         Comparator<Integer> com = (x, y) -> {
     7             System.out.println(x);
     8             System.out.println(y);
     9             return 0;
    10         };
    11         System.out.println(com.compare(1, 3));
    12     }

      4.多个参数,一条语句,有返回值

     1     /**
     2      * 语法四:多个参数,一条语句,有返回值
     3      */
     4     @Test
     5     public void test4() {
     6         //只有一条语句与返回值时,大括号和return都可以省略
     7         Comparator<Integer> com = (x, y) -> 0;
     8         
     9         System.out.println(com.compare(1, 3));
    10     }

      注意:只有一条语句与返回值时,大括号和return都可以省略。

      5.Lambda表达式得参数列表可以不用写,因为JVM编译器可以通过上下文推断出类型,即“类型推断”

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

      函数式接口:接口中只有一个抽象方法时,那么这个接口叫做函数式接口。函数式接口可以使用@FunctionalInterface修饰,jvm会自动检查该接口是否为函数式接口。

    1 @FunctionalInterface
    2 public interface myLambdaModle<T> {
    3 
    4     public int test(T t1, T t2);
    5     
    6 }

      需求:对两个数进行运算

     1     @Test
     2     public void test5() {
     3         int sum1 = myTest(3, 6, (x, y) -> x*y);
     4         int sum2 = myTest(3, 6, (x, y) -> x-y);
     5         int sum3 = myTest(3, 6, (x, y) -> x+y);
     6         int sum4 = myTest(3, 6, (x, y) -> x/y);
     7     }
     8     
     9     
    10     public int myTest(int o1, int o2, myLambdaModle<Integer> m) {
    11         return m.test(o1, o2);
    12     }

      这样,我们就可以使用一个接口就对数字进行运算操作,具体什么操作可以自己去定义。

      从本文可以看出,原来JDK1.7以前,如果定义一个抽象方法,一个方法,就只能实现一种运算,而现在,实现完全可以自己去定义代码简化了许多。后面随笔会继续学习java8的四大内置得核心函数式接口。

        

  • 相关阅读:
    Android学习笔记——启动Activity及Activity生命周期
    TransposonPSI——转座子分析的入门自学
    关于 GraPhlAn 的孤独自学
    Javascript 正则表达式 子表达式
    关于set,list,map的理解
    js关于日期的操作
    JDBC和JTA事务区别
    远程调试本地服务或程序
    Fragment的数据传递
    记录自己的第一篇博客
  • 原文地址:https://www.cnblogs.com/wuyx/p/8972311.html
Copyright © 2011-2022 走看看