书评:精通Lambda:多核世界中的Java编程

从版本8开始,λ编程(lambda编程)终于在Java世界中引入。此功能将在很大程度上改变Java开发人员的编程方式以及针对样板代码的新“武器”。 Java 8通过引入新的Stream API,大部分已将函数式编程应用在Collections API中。 此外,此新功能有望使我们轻松进入多核世界,而无需担心线程,派生联接等问题。

将lambda功能集成到传统的面向对象的编程语言中一直是一个挑战,但是Oracle似乎在提供半功能性面向对象的语言方面做得很好,有点夸大了。
关于Java 8的许多书籍已经出版,使Java开发人员的生活更加轻松。 但是,只有少数几本书仅涉及Java 8中的λ编程。Maurice的书就是其中之一。

Maurice Naftalin是另一本著名的著作《 Java Generics and Collections 》的作者,并维护lambda FAQ ,他从中获得了有关新λ-API( JSR-335 )的大量经验。 长期经验的结果就是这本有关Java 8 lambda的新书。
尽管其他有关该主题的书籍都在描述新API时提供了简单的示例,但Maurice的书采用了一种更为实用的方式,描述了“使用Lambda表达式和流的最佳实践”。

这本书解决了棘手的主题,并且没有像其他书籍一样提供简单的示例来演示API的用法。 作者试图利用他解决复杂问题的经验,以实用的方式向读者介绍新的思维方式。
更详细地:

第一章中, Maurice为这些Java 8新功能的推理奠定了基础,并将在他的其余书中进行分析:

  • 从内部到外部迭代
  • 从收藏到流
  • 从顺序到并行

他详细介绍了设计解决方案背后的原因以及上述主题的选定语法,从而使读者确信这些更改是多么自然地引入到语言中的。

第2章专门介绍lambda表达式。 它将lambda与匿名内部类进行比较,他讨论了变量捕获(也称为闭包),然后转到函数接口。 子章节应尽可能简洁。 他解释了静态绑定和非绑定实例方法引用之间的区别(您知道区别吗?)并以(函数)类型检查和重载解析规则(包括lambda表达式和方法引用)告终。

那么,为什么在绑定str::replace未绑定String::concat ? 根据莫里斯(Maurice)的说法,绑定方法引用是所谓的,因为方法引用是随接收器一起固定的。 所以str::replace等效于(x,y) -> str.replace(x,y) 。 您对接收器是什么没有任何选择。 它绑定到其receiver (str)

在调用接收器之前,尚未决定未绑定的方法引用。 所以String::concat等效于(receiver,str) -> receiver.concat(str) 。 它期望获得一个接收器作为其第一个参数。

第3章通过将流与管道进行比较来介绍流。 他介绍了如何启动流(管道),如何对其进行转换(例如,过滤,映射,排序,截断等)以及如何结束它(例如,减少,收集,搜索等)。 他涉及并行和调试。 他提供了有用且务实的例子。

第4章讨论如何结束流,即减少和收集。 他还很费劲地解释了如何编写自己的收藏家。 一切都通过图表说明了它们的工作方式以及示例。

第5章讨论如何创建流,即源和分离器。 在这里,他介绍了递归grep命令的工作示例,并描述了实现该命令必须解决的错误。 莫里斯(Maurice)在他的整本书中都没有提供解决方案。 通常,在他的推理中,您会发现类似以下的语句:“暂时停止阅读并考虑此数据结构的设计”或“如果尚未解决,请立即停止编写或概述代码” 。

第6章介绍流性能。 他使用jmh对顺序和并行流,排序,不同,分离器,收集器等进行微基准测试。并行流并不总是比顺序流快,但它们必须满足某些条件才能比顺序流更好地执行。

最后, 第7章讨论了接口中的静态方法和默认方法,以及默认方法如何使API不断发展并保持向后兼容性。 他讨论了在哪里使用默认方法,并将具有默认方法的接口与抽象类进行了比较。

他介绍了继承,提供了​​两个易于记忆的规则:
a)“实例方法的选择优先于默认方法”
b)“如果一个类继承了多个竞争默认方法,那么将选择不可覆盖的默认方法。”

本章涵盖了我所见过的关于默认和静态方法的主题的最完整的介绍。
您应该购买这本书的五个原因:

  • 小而简洁; 就个人而言,完成一本175页的书(而且我做到了)的机会要多于一本500或1000页的书。
  • 作者试图使您成为功能性程序员的思考。 他没有为您提供解决方案。
  • 它结构合理,易于找到所需内容
  • 这是一本书,您会一次又一次地回到
  • 它解决了性能问题,并提供了有关性能缺陷和反模式的有用建议。

他们说:“昂贵的香水装在小瓶中。” 总而言之,这是一本非常有用的小书,当您使用Java 8中的新lambda和流API进行编程时,将一遍又一遍地回顾一本。Maurice的新书应该成为每一个Java的底蕴。想了解Java 8中的λ和流的开发人员。

图书链接: 精通Lambda:多核世界中的Java编程

翻译自: https://www.javacodegeeks.com/2014/12/book-review-mastering-lambdas-java-programming-in-a-multicore-world.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js框架

PS:https://www.cnblogs.com/zx0303/p/js-liuxingkuangjia.html 下边这张表简述了js目前的流行框架的优点: AngularJ.js 由google开发,2009年首次发布 很流行的前端框架使用Angular.js创建第一个UI,成本很…

Spring-Quartz (一)

摘自: http://www.blogjava.net/Jay2009/archive/2009/03/25/259176.htmlSpring为创建Quartz的Scheduler、Trigger和JobDetail提供了便利的FactoryBean类,以便能够在Spring 容器中享受注入的好处。此外Spring还提供了一些便利工具类直接将Spring中的Bean…

如何在Java Reflection中的类下获取所有方法信息?

本文以我以前的文章为基础 。 在本文中,我们将看到如何使用Java Reflection检索类相关信息。 我们将重点介绍方法名称。 注意:我将创建一个单独的反射器实用程序类,在该类中,我们在其构造函数中输入一个目标类,然后使…

在Java EE 7上骑骆驼–带有Swagger文档的REST服务

骆驼开箱即用。 Swagger集成就是其中之一。 不幸的是,大多数已经存在的功能都严重依赖于Spring。 但这并不能阻止我们在普通的Java EE 7应用程序中使用它们,因为有时它只是服务器的轻量级变体。 但我不想再对此进行讨论。 相反,我认为在所有情…

怎么隐藏滚动条又能滚动

1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <title>滚动条隐藏</title>6 <style>7 body, ul, li {8 margin: 0;9 padding: 0; 10 …

Eclipse to android

JDK Eclipse Android SDK ADT 1 必须软件 Java JDK SE 1.6 (jdk-7u9-windows-i586.exe) Eclipse (Eclipse IDE for Java Developers) Google Android SDK (android-sdk_r15-windows.zip) ADT (ADT-15.0.0.zip) 如果找不到可参考&#xff1a; http://blog.csdn.net/zhenyong…

用多态和组合替换多个条件

这是一种众所周知的重构模式&#xff0c;可以将条件条件替换为多态性。 如果您不熟悉该模式&#xff0c;可以在此处查看 。 但是&#xff0c;一旦该类中有多个条件检查所基于的字段&#xff0c;该基本解决方案便会开始崩溃。 我们将研究一些有关如何使用这些可能性的想法。 有…

canvas画饼图

<style> body { background: black; text-align: center; } #cans { background: white; } </style> <script> function disToRad(n){//将度数表示弧度计算的方法 return n*Math.PI/180;//π用PI表示&#xff0c;π180&#xff0c;所以1PI/180 } w…

Web设计趋势分析

本文译自网站设计公司weavora.com&#xff0c;介绍了在他们眼里 8 个 Web 设计趋势&#xff1a;单页面、用照片做背景、色块设计、超大号的图片、聚焦简洁、响应式设计、视差滚动、强调字体&#xff0c;每个趋势后面都附了数个案例&#xff0c;相信对网站设计师会有一定的参考价…

使用Jasmine,Spock和Nashorn测试JVM服务器端JavaScript

JavaScript使用不仅限于浏览器中的客户端代码或NodeJS支持的服务器端代码。 许多基于JVM的项目都将其用作内部脚本语言。 测试这种功能既不简单也不标准。 在本文中&#xff0c;我打算演示一种使用成熟的工具&#xff08;例如Jasmine &#xff0c; Spock和Nashorn在服务器端JVM…

C#中的多态

封装、继承、多态&#xff0c;面向对象的三大特性&#xff0c;前两项理解相对容易&#xff0c;但要理解多态&#xff0c;特别是深入的了解&#xff0c;对于初学者而言可能就会有一定困难了。我一直认为学习OO的最好方法就是结合实践&#xff0c;封装、继承在实际工作中的应用随…

AJAX JSON

1、AJAX [1] AJAX简介 > 全称&#xff1a; Asynchronous JavaScript And XML > 异步的JavaScript和XML > AJAX就是通过JavaScript向服务器发送请求&#xff0c;并接收响应&#xff0c;然后我们在通过DOM来修改页面。 > XML指的是服务器响应的…

在WildFly 8.2中修补焊接3 – Java EE 8的第一个实验RI

Java EE 8一直在发展&#xff0c;并且已经提出了几个新的组件JSR。 JSR 365将定义CDI 2.0的规范。 红帽公司已经开始研究Weld 3的实现原型&#xff0c;并且Alpha3最近发布了 。 Red Hat的Java EE 8兼容应用服务器将是WildFly&#xff0c;将在其中实现所有不同的技术。 同时&am…

mat-form-field must contain a MatFormFieldControl错误的解决方法

下面的代码竟然出错了&#xff1a; <mat-form-field><input matInput placeholder"输入名称"></mat-form-field> 错误提示的莫名其妙&#xff0c;其实只要导入以下模块就可了&#xff1a; imports: [MatFormFieldModule,MatInputModule,] 更多专业…

lua# lua5.1.4 源码文件作用一览

写了个脚本列出lua源码C文件头部的注释&#xff0c;作为我有一搭没一搭以Lua为对象学习编译原理的开端。 lua5.1.4全部的源码有35个C文件&#xff0c;17216行代码。每个文件基本的功能如下 ./output_lua_sources_comments.sh ~/resources/sources/lua/src …

带有Hibernate OGM的NoSQL –第一部分:持久化您的第一个实体

Hibernate OGM的第一个最终版本已经发布 &#xff0c;团队从发布狂潮中恢复了一些。 因此&#xff0c;他们考虑建立一系列教程式博客&#xff0c;使您有机会轻松地从Hibernate OGM重新开始。 感谢Gunnar Morling&#xff08; gunnarmorling &#xff09;创建了本教程。 介绍 不…

为自己写程序之JavsScript代码段测试器

JavaScript的测试&#xff0c;通常是在Firefox的firebug插件中测试的。不过有时只是测试几行代码都要写一个html&#xff0c;再打开浏览器测试运行结果&#xff0c;感觉并不是很方便。 今天花了点时间做了一个简易的JS片段测试器。其实这主要是看了IronJs开源项目以后&#xff…

sizeof和strlen的区别(其中涉及NUL的讲解)

本文是自己结合平时所学的知识&#xff0c;对sizeof和strlen的区别进行了总结&#xff0c;如有不对的地方还请批评指证&#xff0c;共同进步&#xff01;&#xff01;&#xff01; 一、从C语言的定义上来讲 1、sizeof是关键字&#xff0c;而strlen是包含在string.h头文件中的一…

我的Wiki:使用JConsole对WildFly(或JBoss AS7)进行远程JMX访问

与以前的版本相比&#xff0c;JBoss AS7的目标之一是使其在默认情况下更加安全。 受此目标直接影响的领域之一是&#xff0c;您不再期望服务器在端口上公开某些服务&#xff0c;而无需任何身份验证/授权就可以访问它。 请记住&#xff0c;在以前的JBoss AS版本中&#xff0c;只…

js判断对象类型

1.typeof typeof只能判断区分基本类型&#xff0c;number、string、boolean、undefined和object,function&#xff1b; typeof 0; //number; typeof true; //boolean; typeof undefined; //undefined; typeof "hello world" //string; typeof function(){}; …