lambda java_Java Lambdas简介
lambda java
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
lambda java
lambda java_Java Lambdas简介相关推荐
- Python语言学习之lambda:lambda函数的简介、使用方法、案例大全之详细攻略
Python语言学习之lambda:lambda函数的简介.使用方法.案例大全之详细攻略 目录 lambda函数的简介 1.lambda匿名函数的格式 2.lambda函数特点 3.lambda函数与 ...
- Java Lambdas简介
Java 8的主题是lambdas. 我已经注意到,对于许多Java程序员来说,lambda都是非常难的材料. 因此,让我们尝试对它们有一个基本的了解. 首先,lambda到底是什么? Lambda是 ...
- C++:匿名函数(Lambda函数)简介
1.什么是Lambda函数 Lambda函数又称为匿名函数,从名字可知,与普通的函数相比,不需要命名,直接调用. 例如: 普通函数定义加法: int add(int x, int y) {return ...
- field java_Java : Field 简介
java.lang.reflect.Field API 简介 package chapter.lang.reflect; import org.slf4j.Logger; import org.slf ...
- tdd java_Java TDD简介–第2部分
tdd java 再次问好! 在上一篇博客文章中,我在没有紧密引用Java的情况下总体上解释了TDD理论 ,但是在这一部分中,我们开始进行TDD实践. 我们的目标是遍历TDD的所有阶段:从需求分析到测 ...
- tdd java_Java TDD简介–第1部分
tdd java 欢迎来到测试驱动开发 (TDD)系列的介绍. 我们将在TDD上下文中讨论Java和JUnit ,但这只是工具. 本文的主要目的是使您全面了解TDD,而无论使用哪种编程语言和测试框架. ...
- lambdas for_Java 8发布了! — Lambdas教程
lambdas for 为了庆祝几分钟前发布的Java 8的发布,我正在发布Java 8 Lambdas教程的草稿版本. 这是学习Streams API的一种很好的可视化方式,从第一天开始,它将帮助您 ...
- Java 8发布了! — Lambdas教程
为了庆祝几分钟前发布的Java 8的发布,我正在发布Java 8 Lambdas教程的草稿版本. 这是学习Streams API的一种很好的可视化方法,从第一天开始,它将帮助您开始在自己的应用程序中利 ...
- 重温强化学习之无模型学习方法:TD(lambda)
1.多步自举 一步TD:TD(0),白色圈V函数,黑色Q函数,后继状态V函数更新当前状态V函数,采样,智能体和环境进行交互.根据状态采取一个动作,转为后继状态,环境给一个奖励-->采样一步得到后 ...
最新文章
- Docker 容器技术 — 容器网络
- 九年级数学解方程50道_九年级数学知识点总结与重点难点总结,考前必看!
- C#读取配置文件app.config
- 三轴加速度传感器和六轴惯性传感器_美泰产品推介MSV3100A三轴加速度传感器
- 切记:只有肯吃苦才能赚大钱!
- 物联网智能硬件设备常见攻击方法
- eclipseweb开发response和request接收发送数据乱码问题
- html如何设置轮动,手把手教你构建轮动策略
- PageHelper.startPage(pageNum,pageSize)分页不起作用
- Cannot resolve the name 'repository:auditing-attributes' to a(n) 'attribute grou
- Cloudera Manager 基本介绍(CDH版本)
- 十种常见的图像标注方法 | 数据标注
- 深入学习HTTP协议
- 漫步在云台山茶园穿越,感受来自李亮先生的美意
- Gnuplot 绘图
- 出现make: *** No rule to make target `all'. Stop.解决办法
- 车牌识别 瞬间启动 快速抓拍 超低功耗 的4G智能摄像头方案
- Alpha阶段敏捷冲刺⑦
- vscode远程连接服务器操作方法
- 请你谈谈如何破坏双亲委派模型?