zoukankan      html  css  js  c++  java
  • Java 8 新特性-菜鸟教程 (1) -Java 8 Lambda 表达式

    Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。

    Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

    使用 Lambda 表达式可以使代码变的更加简洁紧凑。

    语法

    lambda 表达式的语法格式如下:

    (parameters) -> expression
    或
    (parameters) ->{ statements; }

    以下是lambda表达式的重要特征:

    • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
    • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
    • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
    • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。

    Lambda 表达式实例

    在 Java8Tester2.java 文件输入以下代码:

    package java8.cainiao;
    
    public class Java8Tester2 {
           public static void main(String args[]){
              Java8Tester2 tester = new Java8Tester2();
                
              // 类型声明
              MathOperation addition = (int a, int b) -> a + b;
                
              // 不用类型声明
              MathOperation subtraction = (a, b) -> a - b;
                
              // 大括号中的返回语句
              MathOperation multiplication = (int a, int b) -> { return a * b; };
                
              // 没有大括号及返回语句
              MathOperation division = (int a, int b) -> a / b;
                
              System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
              System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
              System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
              System.out.println("10 / 5 = " + tester.operate(10, 5, division));
                
              // 不用括号
              GreetingService greetService1 = message ->
              System.out.println("Hello " + message);
                
              // 用括号
              GreetingService greetService2 = (message) ->
              System.out.println("Hello " + message);
                
              greetService1.sayMessage("Runoob");
              greetService2.sayMessage("Google");
           }
            
    
            
           private int operate(int a, int b, MathOperation mathOperation){
              return mathOperation.operation(a, b);
           }
        }
    
    
    interface MathOperation {
        int operation(int a, int b);
     }
      
    
    interface GreetingService {
        void sayMessage(String message);
     }

    执行以上脚本,输出结果为:

    10 + 5 = 15
    10 - 5 = 5
    10 x 5 = 50
    10 / 5 = 2
    Hello Runoob
    Hello Google

    使用 Lambda 表达式需要注意以下两点:

    • Lambda 表达式主要用来定义行内执行的方法类型接口,例如,一个简单方法接口。在上面例子中,我们使用各种类型的Lambda表达式来定义MathOperation接口的方法。然后我们定义了sayMessage的执行。
    • Lambda 表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。

    变量作用域

    lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。

    在 Java8Tester3.java 文件输入以下代码:

    package java8.cainiao;
    
    public class Java8Tester3 {
         
           final static String salutation = "Hello! ";
           
           public static void main(String args[]){
              GreetingService greetService1 = message -> 
              System.out.println(salutation + message);
              
              greetService1.sayMessage("Runoob");
           }
            
           interface GreetingService {
              void sayMessage(String message);
           }
        }

    执行以上脚本,输出结果为

    Hello! Runoob

    1.lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义)

    编译报错:The final field Java8Tester3.salutation cannot be assigned

     2.在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。

    String first = "";  
    Comparator<String> comparator = (first, second) -> Integer.compare(first.length(), second.length());  //编译会出错
  • 相关阅读:
    康复计划
    Leetcode 08.02 迷路的机器人 缓存加回溯
    Leetcode 38 外观数列
    Leetcode 801 使序列递增的最小交换次数
    Leetcode 1143 最长公共子序列
    Leetcode 11 盛水最多的容器 贪心算法
    Leetcode 1186 删除一次得到子数组最大和
    Leetcode 300 最长上升子序列
    Leetcode95 不同的二叉搜索树II 精致的分治
    Leetcode 1367 二叉树中的列表 DFS
  • 原文地址:https://www.cnblogs.com/crazylqy/p/8866972.html
Copyright © 2011-2022 走看看