作为参数使用Lambda表达式

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

public static void main(String[] args) {int n1 = 10;int n2 = 5;// 打印加法计算结果display((a, b) -> {return a + b;}, n1, n2);// 打印减法计算结果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和实例方法 sub。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 表达式只能访问局部变量而不能修改,否则会发生编译错误,但对静态变量和成员变量可读可写。

方法引用

方法引用可以理解为 Lambda 表达式的快捷写法,它比 Lambda 表达式更加的简洁,可读性更高,有很好的重用性。如果实现比较简单,复用的地方又不多,推荐使用 Lambda 表达式,否则应该使用方法引用。

Java 8 之后增加了双冒号::运算符,该运算符用于“方法引用”,注意不是调用方法。“方法引用”虽然没有直接使用 Lambda 表达式,但也与 Lambda 表达式有关,与函数式接口有关。 方法引用的语法格式如下:

ObjectRef::methodName

其中,ObjectRef 是类名或者实例名,methodName 是相应的方法名。

注意:被引用方法的参数列表和返回值类型,必须与函数式接口方法参数列表和方法返回值类型一致,示例代码如下。

public class LambdaDemo {// 静态方法,进行加法运算// 参数列表要与函数式接口方法calculateInt(int a, int b)兼容public static int add(int a, int b) {return a + b;}// 实例方法,进行减法运算// 参数列表要与函数式接口方法calculateInt(int a, int b)兼容public int sub(int a, int b) {return a - b;}
}

LambdaDemo 类中提供了一个静态方法 add,一个实例方法 sub。这两个方法必须与函数式接口方法参数列表一致,方法返回值类型也要保持一致。

public class HelloWorld {public static void main(String[] args) {int n1 = 10;int n2 = 5;// 打印加法计算结果display(LambdaDemo::add, n1, n2);LambdaDemo d = new LambdaDemo();// 打印减法计算结果 display(d::sub, 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));}
}

代码第 18 行声明 display 方法,第一个参数 calc 是 Calculable 类型,它可以接受三种对象:Calculable 实现对象、Lambda 表达式和方法引用。代码第 6 行中第一个实际参数LambdaDemo::add是静态方法的方法引用。代码第 9 行中第一个实际参数d::sub,是实例方法的方法引用,d 是 LambdaDemo 实例。

提示:代码第 6 行的LambdaDemo::add和第 9 行的d::sub是方法引用,此时并没有调用方法,只是将引用传递给 display 方法,在 display 方法中才真正调用方法。

Java Lambda表达式的使用相关推荐

  1. Java Lambda表达式入门

    本文转自:http://blog.csdn.net/renfufei... 转载请注明出处 原文链接: Start Using Java Lambda Expressions 下载示例程序 Examp ...

  2. java拉姆达表达式事例,Java Lambda表达式详解和实例

    简介 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体( ...

  3. Java Lambda表达式forEach无法跳出循环的解决思路

    Java Lambda表达式forEach无法跳出循环的解决思路 如果你使用过forEach方法来遍历集合,你会发现在lambda表达式中的return并不会终止循环,这是由于lambda的底层实现导 ...

  4. Java Lambda表达式初探

    前言 本文受启发于Trisha Gee在JavaOne 2016的主题演讲Refactoring to Java 8. Java 8已经发行两年多,但很多人仍然在使用JDK7.对企业来说,技术上谨慎未 ...

  5. Java Lambda 表达式(又名闭包 (Closure)/ 匿名函数 ) 笔记

    Java Lambda 表达式(又名闭包 (Closure)/ 匿名函数 ) 笔记 根据 JSR 335, Java 终于在 Java 8 中引入了 Lambda 表达式.也称之为闭包或者匿名函数. ...

  6. java lambda 表达式中的双冒号和箭头的用法 ::

    先构造一些数据,创建一个User类 java lambda 表达式中的双冒号的用法 :: 双冒号运算就是Java中的[方法引用],[方法引用]的格式是 类名::方法名 如下图所示 User是一个类, ...

  7. Lambda表达式的生动理解以及Java Lambda表达式常见使用场景

    本篇承接上一篇 Java Lambda 表达式快速学习 , 对Lambda 表达式的语法格式进行演化说明, 并对Java 中Lambda表达式的常见使用场景进行说明. Lambda 表达式怎么来的? ...

  8. Java Lambda 表达式快速学习

    Lambda 表达式来源于数学, 因为其简洁性,很多开发语言都支持, Java 在版本8 开始引入. Lamba 表达式是什么? 匿名内部类 接口只能有一个需要被实现的方法 Lamba 表达式作用 代 ...

  9. java lambda表达式 steam api

    java lambda表达式 steam api 案例使用 java版本为 jdk-17 foreach 遍历 public class JavaDemo03 {public static void ...

  10. 【外文翻译】外国友人写得很不错的Java Lambda表达式入门教程,我终于翻译好给大家啦!!!...

    " 英语原文的链接在最底下的"阅读原文" " 简介 (译者认为: 超过 3 行的逻辑就不适用 Lambda 表达式了.虽然看着很先进,其实 Lambda 表达式 ...

最新文章

  1. 《github一天一道算法题》:并归排序
  2. 提高jQuery执行效率
  3. feign调用第三方接口_讲一个你不知道的事:SringCloud的feign的继承特性
  4. java 设计模式 示例_Java中的中介器设计模式-示例教程
  5. OSChina 周日乱弹 —— 昨天夜生活很丰满
  6. python在匿名函数作和_python之路——内置函数和匿名函数
  7. 使用Forms验证存储用户自定义信息
  8. 【Flink】FLink 反序列化空指针 java.lang.String.<init> SimpleStringSchema
  9. mysql 数据库表重建_mysql 数据库表重建
  10. 高效的SQLSERVER分页查询(推荐)
  11. CDlinux如何制作U盘启动(附带Minidwep-gtk工具)
  12. 手心输入法皮肤制作技巧
  13. kali中exiftool命令查看图片exif信息
  14. 我是如何接单的! 全网最强的接单 避坑指南 都在这里!
  15. Fiddler无法抓手机APP数据包的解决办法
  16. Java数组(Array)
  17. 网吧用的语音呼叫软件
  18. 数据库E-R图与关系模式图
  19. 给微信好友自动发消息
  20. MCP2515板级驱动

热门文章

  1. cmd代码表白_手把手教你把Python代码转成exe
  2. python取出字典中最大值_python找出字典中value最大值的几种方法
  3. sata接口测试软件,如何查看电脑是否支持USB 3.0?Hwinfo32检测SATA端口的方法
  4. U盘装win7系统出现question(1808)的解决方法
  5. java中字典算法_Java字典生成算法讲解
  6. Java中的return this
  7. 学习Spring Boot:(十九)Shiro 中使用缓存
  8. linux误删文件咋恢复,恢复Linux误删文件
  9. python分析犯罪数据_使用 SparkSQL 分析纽约市犯罪数据
  10. http 和 https_Golang设置https访问,以及http如何重定向到https