Java Lambdas简介
Java 8的主题是lambdas。 我已经注意到,对于许多Java程序员来说,lambda都是非常难的材料。 因此,让我们尝试对它们有一个基本的了解。
首先,lambda到底是什么? Lambda是一个匿名函数,与常规函数不同,它没有绑定到标识符(即,它没有名称)。 这些函数可以作为参数传递给其他函数(称为高阶函数)。
假设我们的应用程序必须从系统的不同位置写入一堆文件。 我们不想每次都处理已检查的异常[请参阅“ 例外:已检查和未检查”以获取有关已检查的异常的更多信息]。 因此,我们决定编写一个低级的writeToFile
函数,该函数将打开FileWriter
并将其传递给可以安全地写入文件的函数。
使用此低级函数,我们编写以下代码。
writeToFile("todo.txt", new FileWriteFunction() {@Overridepublic void apply(Writer file) throws IOException {file.write("learn about lambdas\n");file.write("learn stream API\n");}
})
我们传递给writeToFile
的对象是FileWriteFunction
的匿名实现[是匿名的,因为我们没有将其命名为类]。 它具有单个功能,因此可以有效地传递匿名功能。 在Java的世界中,这些有时称为回调 。 可能您以前至少使用过几次,也许没有引起注意。
该匿名对象实际上是lambda。 但这显然不像传递函数。 语法非常笨拙。 这正是Java 8中的变化。
有了Java 8中对lambda的语法支持,代码的读取就像我们传递函数一样。 使用Java 8 lambda,我们将上述代码重写如下。
writeToFile("todo.txt", file -> {file.write("learn about lambdas\n");file.write("learn stream API\n");
})
这样更好 它强调重要的代码,并隐藏了大部分笨拙的部分。
通常,lambda与闭包可互换使用(即词汇功能)。 虽然它们都是匿名函数,但是闭包的定义是它是包含绑定变量的函数。 即,闭包包括一个引用表,该表包含对局部变量的引用。
例如,如果我们接受要写入文件的参数data
,则使用闭包。
void save(String data) {writeToFile("file.db", file -> file.write(data) );
}
匿名内部类限制对最终变量的访问,而闭包提供对任何变量的访问。 但是,变量实际上是闭包的最终变量,因此无法将其重新分配。
那lambdas的编译呢? Java 8是否仅使用一种方法就匿名内部类仅提供了一勺语法糖?
不是,不是 的确,它允许对任何单方法匿名内部类使用lambda语法。 但是lambda并没有被编译成内部类。 相反,编译器在定义的类中输出lambda$
方法,并使用invokedynamic
调度该调用。
因此,现在您知道了如何在Java 8中使用lambda。虽然lambda本身非常有用,但在将它们应用于集合时更是如此。
新的Stream API通过为集合提供功能更强大的API来提供迭代器的替代方案: java.util.stream.Stream
。 Stream
上最值得注意的功能是: collect
, filter
, map
和reduce
。
从一个简单的例子开始,这里是如何对列表中的所有数字求和。
asList(1,2,3,4,5).stream().reduce(0, (acc, value) -> acc + value) // => 15
通过从零开始将每个值加到累加器上,可以减少序列。 为了进行比较,通常会编写一个循环。
int acc = 0;
for (int n : asList(1,2,3,4,5))acc += n;
acc // => 15
继续求和仅求奇数。 首先我们filter
奇数,然后reduce
。
asList(1,2,3,4,5).stream().filter(Predicates::odd).reduce(0, (acc, n) -> acc + n) // => 9
filter
的参数是我使用的Predicates
类中对静态odd
函数的函数引用。 顾名思义,这是一个布尔函数,用于测试数字是否为奇数。
到目前为止,一切都很好。 现在,假设我们要将一厘米大小的列表转换为以英寸为单位的等效大小。 我们为此使用map
。
List<Inch> inches = centimeters.stream().map(Centimeter::toInches).collect(Collectors.toList())
通过将toInches
函数应用到centimeters
集合中的每个项目,将centimeters
映射为英寸。
从本质上讲, Stream
是连续的。 它用于描述要应用于集合的操作。 但是要获得结果,必须收集数据。 这就是collect
功能的目的。 它将流的元素简化为可变容器(例如,列表)。
使用Stream API和lambda可以大大简化用于集合的代码,并使代码更具表现力。 与使用破坏性操作(例如forEach
)相比,首选使用非破坏性操作(例如map
, filter
)使代码更易于推理。
而已! 这些是您需要了解的Java 8中的lambda(和闭包)的基础知识。当然,关于lambda的内容还有很多要写的,但这是另一篇文章。
翻译自: https://www.javacodegeeks.com/2013/10/introduction-to-java-lambdas.html
Java Lambdas简介相关推荐
- Java EE 简介
Java EE 简介 Java EE 基本架构 JavaEE 的诞生是为了解决传统 C/S 架构的弊端:客户端臃肿庞大,扩展性差等弊端. JavaEE 将传统的两层结构细分为了四层. 这四层分别是:C ...
- java程序包不存在_第一章 Java语言简介
Java语言简介 Java之父 James Gosling(詹姆斯·高斯林) 正式诞生时间 1995年,已有二十多年历史 三大方向 JavaSE(桌面版,基础需重点掌握) JavaME(移动版,现在基 ...
- (一:NIO系列)JAVA NIO 简介
出处:JAVA NIO 简介 Java 中 New I/O类库 是由 Java 1.4 引进的异步 IO.由于之前老的I/O类库是阻塞I/O,New I/O类库的目标就是要让Java支持非阻塞I/O, ...
- ibm java_IBM i 上Java 虚拟机简介
Abstract IBM i 上Java 虚拟机简介 Body Java在IT业界有多流行?google上搜索一下java, 结果一目了然(今天早上我搜索到的记录数是840000000条).Java之 ...
- Java异常(一) Java异常简介及其架构
概要 本章对Java中的异常进行介绍.内容包括: Java异常简介 Java异常框架 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3544168.htm ...
- Java:计算机编程语言Java的简介、编程环境/工具、如何学习Java之详细攻略
Java:计算机编程语言Java的简介.编程环境/工具.如何学习Java之详细攻略 目录 Java的简介 1.Java的工作原理--基于Eclipse等编程Java语言→定义Java类→Java虚拟机 ...
- OpenCV Java开发简介
OpenCV Java开发简介 OpenCV Java开发简介 我们将在本指南中做什么 获得适当的OpenCV 下载 构建 Java示例与Ant Java和Scala的SBT项目 运行SBT样本 Op ...
- JDK14中的java tools简介
文章目录 故事发生了 java tools简介 jaotc jar jarsigner java javac javadoc javap jcmd jconsole jdb jdeprscan jde ...
- JAVA NIO 简介 (netty源码死磕1.1)
[基础篇]netty 源码死磕1.1: JAVA NIO简介 1. JAVA NIO简介 Java 中 New I/O类库 是由 Java 1.4 引进的异步 IO.由于之前老的I/O类库是阻塞I/ ...
最新文章
- sql server 2008 r2 没有维护计划_坚果R2发布,骁龙865+1亿像素+90Hz,4499元起
- 有三AI 1000问回归,备战秋招,更多,更快,更好,等你来战!
- 深度学习:反向传播(back-propagation)
- 孙悟空为什么被封为斗战胜佛
- 投靠Linux第一步 Windows数据向Linux迁徙(1)
- longest-repeating-character-replacement(难)
- [Abp vNext 源码分析] - 2. 模块系统的变化
- 论文浅尝 | 利用冻结语言模型的多模态少样本学习
- datagrid如何获取一行数据中的某个字段值_或许是全网最全面关于数据库面试题...
- osc mysql_MySQL学习(一) - osc_0sz5p35w的个人空间 - OSCHINA - 中文开源技术交流社区...
- openCV+ASM+LBP+Gabor实现人脸识别(GT人脸库)
- redis的持久化相关操纵
- 土建类技术质量知识题库
- 【精选】抽奖点名、随机抽奖PPT素材合集,年会、老师必备
- 给出a-z,0-9,输出所有的3个字符的组合
- [硬件基础]开关电源和线性稳压器的优缺点?
- python3 简单爬虫实战|使用selenium来模拟浏览器抓取选股宝网站信息里面的股票
- 风青杨:马云为何被浙商“炮…
- html把图片做成导航条背景,DIV+CSS背景图片导航菜单的实现方法
- SWITCH语句中如果执行了一条CASE语句是空的后,程序会
热门文章
- matlab eval 不显示,matlab中 eval(command); 运算符无效的问题
- python重定向到socket_python套接字流重定向实例汇总
- springboot使用ImportBeanDefinitionRegistrar 动态注册bean
- 405: HTTP method GET is not supported by this URL
- 二叉树:HDU1754
- 组装一台计算机 java_如何在同一台计算机上安装多个Java版本
- jdk9与jdk11哪个好_JDK 9、10和11中的安全性增强
- openapi_MicroProfile OpenAPI上的Swagger UI
- javaee概览_Java 9概览
- oauth2和jwt_OAuth2,JWT,Open-ID Connect和其他令人困惑的事物