java

导航

JavaLambda表达式的使用

来源 :中华考试网 2020-11-24

  在《Java Lambda表达式》和《Java Lambda表达式的3种简写方式》一节中我们了解了 Java Lambda 的概念并可以在匿名类的场合使用 Lambda 语法进行简单替换。本节主要介绍在 Java 中如何使用 Lambda 表达式。

  作为参数使用Lambda表达式

  Lambda 表达式一种常见的用途就是作为参数传递给方法,这需要声明参数的类型声明为函数式接口类型。示例代码如下:

  public static void main(String[] args) {

  int n1 = 10;

  int n2 = 5;

  // 打印加法计算结果

  display((a, b) -> {

  return a + b;

  }, n1, n2);

  // 打印减法计算结果

  填写下面表单即可预约申请免费试听java课程!害怕学不会?助教陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

  display((a, b) -> a - b, n1, n2);

  }

  /**

  * 打印计算结果

  *

  * @param calc Lambda表达式

  * @param n1 操作数1

  * @param n2 操作数2

  */

  public static void display(Calculable calc, int n1, int n2) {

  System.out.println(calc.calculateInt(n1, n2));

  }

  上述代码第 19 行定义 display 打印计算结果方法,其中参数 calc 类型是 Calculable,这个参数即可以接收实现 Calculable 接口的对象,也可以接收 Lambda 表达式,因为 Calculable 是函数式接口。 代码第 7 行和第 9 行两次调用 display 方法,它们第 一个参数都是 Lambda 表达式。

  访问变量

  Lambda 表达式可以访问所在外层作用域定义的变量,包括成员变量和局部变量。

  访问成员变量

  成员变量包括实例成员变量和静态成员变量。在 Lambda 表达式中可以访问这些成员变量,此时的 Lambda 表达式与普通方法一样,可以读取成员变量,也可以修改成员变量。

  public class LambdaDemo {

  // 实例成员变量

  private int value = 10;

  // 静态成员变量

  private static int staticValue = 5;

  // 静态方法,进行加法运算

  public static Calculable add() {

  Calculable result = (int a, int b) -> {

  // 访问静态成员变量,不能访问实例成员变量

  staticValue++;

  int c = a + b + staticValue;

  // this.value;

  return c;

  };

  return result;

  }

  // 实例方法,进行减法运算

  public Calculable sub() {

  Calculable result = (int a, int b) -> {

  // 访问静态成员变量和实例成员变量

  staticValue++;

  this.value++;

  int c = a - b - staticValue - this.value;

  return c;

  };

  return result;

  }

  }

  LambdaDemo 类中声明一个实例成员变量 value 和一个静态成员变量 staticValue。此外,还声明了静态方法 add(见代码第 8 行)和实例方法 sub(见代码第 20 行)。add 方法是静态方法,静态方法中不能访问实例成员变量,所以代码第 13 行的 Lambda 表达式中也不能访问实例成员变量,也不能访问实例成员方法。

  sub 方法是实例方法,实例方法中能够访问静态成员变量和实例成员变量,所以代码第 23 行的 Lambda 表达式中可以访问这些变量,当然实例方法和静态方法也可以访问。当访问实例成员变量或实例方法时可以使用 this,如果不与局部变量发生冲突情况下可以省略 this。

  访问局部变量

  对于成员变量的访问 Lambda 表达式与普通方法没有区别,但是访问局部变量时,变量必 须是 final 类型的(不可改变)。

  示例代码如下:

  public class LambdaDemo {

  // 实例成员变量

  private int value = 10;

  // 静态成员变量

  private static int staticValue = 5;

  // 静态方法,进行加法运算

  public static Calculable add() {

  // 局部变量

  int localValue = 20;

  Calculable result = (int a, int b) -> {

  // localValue++;

  // 编译错误

  int c = a + b + localValue;

  return c;

  };

  return result;

  }

  // 实例方法,进行减法运算

  public Calculable sub() {

  // final局部变量

  final int localValue = 20;

  Calculable result = (int a, int b) -> {

  int c = a - b - staticValue - this.value;

  // localValue = c;

  // 编译错误

  return c;

  };

  return result;

  }

  }

  上述代码第 10 行和第 23 行都声明一个局部变量 localValue,Lambda 表达式中访问这个变量,如代码第 14 行和第 25 行。不管这个变量是否显式地使用 final 修饰,它都不能在 Lambda 表达式中修改变量,所以代码第 12 行和第 26 行如果去掉注释会发生编译错误。

  Lambda 表达式只能访问局部变量而不能修改,否则会发生编译错误,但对静态变量和成员变量可读可写。

分享到

您可能感兴趣的文章