Java8 的 Lambda 表达式

背景

Lambda 表达式是 Java8 发布的一个很重要的原因,从 Java8 开始允许将一个方法以变量的形式作为参数进行传递,并且使用这种表达式让 Java 代码变得更加的简洁。

语法格式
(params) -> expression
(params) -> {expression} 

如果语句中 expression 表达式只有一句则不必使用 {} 也可以,另外还有一种就是没有参数的情况。

() -> {expression} 或是 () -> expression 
示例
  • 使用 (params) -> expression 的方式进行表达式计算
public static void main(String[] args) {
    
    Method method1 = (int a,int b) -> a + b;
    int res1 = method1.math(2, 3);
    System.out.println(res1);
    Method method2 = (int a,int b) -> a * b;
    int res2 = method2.math(2, 3);
    System.out.println(res2);
  }
  
  public interface Method{
    public int math(int a,int b);
  } 

没有 {} 的表达式,必须是只有一句表达式的时候才可以这样返回,否则便会报错。

  • 使用 (params) -> {expression} 的方式进行表达式计算
public static void main(String[] args) {
    
    Method method1 = (int a,int b) -> { return (a + b); };
    int res1 = method1.math(2, 3);
    System.out.println(res1);
    Method method2 = (int a,int b) -> {return (a * b); };
    int res2 = method2.math(2, 3);
    System.out.println(res2);
    
  }
  
  public interface Method{
    public int math(int a,int b);
  } 

在使用这种表达式的时候必须进行明确的指定返回的是什么,比如 return (a + b)、return (a * b) 都是要明确返回什么内容。

注意:Lambda 表达式执行完以后总体返回的必须是一个接口,比如上述中的 Method 接口。

变量作用域

在使用 Lambda 表达式时,很重要的一点就是关于变量的作用域。在表达式中如果需要引用外部变量进行运算则必须加上 final 关键字才可以,如果不加 final 时则在向后的编码中不能改变这个变量的值,如下进行举例:

public static void main(String[] args) {
    final int c = 3;
    Method method1 = (int a,int b) -> { return (a + b + c); };
    int res1 = method1.math(2, 3);
    System.out.println(res1);
  }
  
  public interface Method{
    public int math(int a,int b);
  } 

将变量 c 引用到表达式中,则给变量 c 加上 final 关键字使其不能改变。

public static void main(String[] args) {
    int c = 3;
    Method method1 = (int a,int b) -> { return (a + b + c); };
    int res1 = method1.math(2, 3);
    System.out.println(res1);
    c = 10;
  }
  
  public interface Method{
    public int math(int a,int b);
  } 

将变量 c 引用到表达式中,并且在后续的执行中又给 c 变量赋值为 10,这种形式在 Lambda 表达式使用时便会报错。

展望

欢迎关注 “老王说编程“,每天进步一点点,您的每一个点赞、在看、分享都是在致力于减少 “攻城狮” 产出的 BUG。

Java8 的 Lambda 表达式_第1张图片

你可能感兴趣的:(javalambda)