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.StreamStream上最值得注意的功能是: collectfiltermapreduce

从一个简单的例子开始,这里是如何对列表中的所有数字求和。

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 )相比,首选使用非破坏性操作(例如mapfilter )使代码更易于推理。

而已! 这些是您需要了解的Java 8中的lambda(和闭包)的基础知识。当然,关于lambda的内容还有很多要写的,但这是另一篇文章。

参考: Software Craft博客上的JCG合作伙伴 Bart Bakker 对Java lambda的介绍 。

翻译自: https://www.javacodegeeks.com/2013/10/introduction-to-java-lambdas.html

Java Lambdas简介相关推荐

  1. Java EE 简介

    Java EE 简介 Java EE 基本架构 JavaEE 的诞生是为了解决传统 C/S 架构的弊端:客户端臃肿庞大,扩展性差等弊端. JavaEE 将传统的两层结构细分为了四层. 这四层分别是:C ...

  2. java程序包不存在_第一章 Java语言简介

    Java语言简介 Java之父 James Gosling(詹姆斯·高斯林) 正式诞生时间 1995年,已有二十多年历史 三大方向 JavaSE(桌面版,基础需重点掌握) JavaME(移动版,现在基 ...

  3. (一:NIO系列)JAVA NIO 简介

    出处:JAVA NIO 简介 Java 中 New I/O类库 是由 Java 1.4 引进的异步 IO.由于之前老的I/O类库是阻塞I/O,New I/O类库的目标就是要让Java支持非阻塞I/O, ...

  4. ibm java_IBM i 上Java 虚拟机简介

    Abstract IBM i 上Java 虚拟机简介 Body Java在IT业界有多流行?google上搜索一下java, 结果一目了然(今天早上我搜索到的记录数是840000000条).Java之 ...

  5. Java异常(一) Java异常简介及其架构

    概要 本章对Java中的异常进行介绍.内容包括: Java异常简介 Java异常框架 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3544168.htm ...

  6. Java:计算机编程语言Java的简介、编程环境/工具、如何学习Java之详细攻略

    Java:计算机编程语言Java的简介.编程环境/工具.如何学习Java之详细攻略 目录 Java的简介 1.Java的工作原理--基于Eclipse等编程Java语言→定义Java类→Java虚拟机 ...

  7. OpenCV Java开发简介

    OpenCV Java开发简介 OpenCV Java开发简介 我们将在本指南中做什么 获得适当的OpenCV 下载 构建 Java示例与Ant Java和Scala的SBT项目 运行SBT样本 Op ...

  8. JDK14中的java tools简介

    文章目录 故事发生了 java tools简介 jaotc jar jarsigner java javac javadoc javap jcmd jconsole jdb jdeprscan jde ...

  9. JAVA NIO 简介 (netty源码死磕1.1)

    [基础篇]netty 源码死磕1.1:  JAVA NIO简介 1. JAVA NIO简介 Java 中 New I/O类库 是由 Java 1.4 引进的异步 IO.由于之前老的I/O类库是阻塞I/ ...

最新文章

  1. sql server 2008 r2 没有维护计划_坚果R2发布,骁龙865+1亿像素+90Hz,4499元起
  2. 有三AI 1000问回归,备战秋招,更多,更快,更好,等你来战!
  3. 深度学习:反向传播(back-propagation)
  4. 孙悟空为什么被封为斗战胜佛
  5. 投靠Linux第一步 Windows数据向Linux迁徙(1)
  6. longest-repeating-character-replacement(难)
  7. [Abp vNext 源码分析] - 2. 模块系统的变化
  8. 论文浅尝 | 利用冻结语言模型的多模态少样本学习
  9. datagrid如何获取一行数据中的某个字段值_或许是全网最全面关于数据库面试题...
  10. osc mysql_MySQL学习(一) - osc_0sz5p35w的个人空间 - OSCHINA - 中文开源技术交流社区...
  11. openCV+ASM+LBP+Gabor实现人脸识别(GT人脸库)
  12. redis的持久化相关操纵
  13. 土建类技术质量知识题库
  14. 【精选】抽奖点名、随机抽奖PPT素材合集,年会、老师必备
  15. 给出a-z,0-9,输出所有的3个字符的组合
  16. [硬件基础]开关电源和线性稳压器的优缺点?
  17. python3 简单爬虫实战|使用selenium来模拟浏览器抓取选股宝网站信息里面的股票
  18. 风青杨:马云为何被浙商“炮…
  19. html把图片做成导航条背景,DIV+CSS背景图片导航菜单的实现方法
  20. SWITCH语句中如果执行了一条CASE语句是空的后,程序会

热门文章

  1. matlab eval 不显示,matlab中 eval(command); 运算符无效的问题
  2. python重定向到socket_python套接字流重定向实例汇总
  3. springboot使用ImportBeanDefinitionRegistrar 动态注册bean
  4. 405: HTTP method GET is not supported by this URL
  5. 二叉树:HDU1754
  6. 组装一台计算机 java_如何在同一台计算机上安装多个Java版本
  7. jdk9与jdk11哪个好_JDK 9、10和11中的安全性增强
  8. openapi_MicroProfile OpenAPI上的Swagger UI
  9. javaee概览_Java 9概览
  10. oauth2和jwt_OAuth2,JWT,Open-ID Connect和其他令人困惑的事物