q7goodies事例_Java 8 Friday Goodies:Lambda和排序

q7goodies事例

在Data Geekery ,我们喜欢Java。 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 ,现在我们觉得是时候开始一个新的博客系列了,……

Java 8星期五

每个星期五,我们都会向您展示一些不错的教程风格的Java 8新功能,这些功能利用了lambda表达式,扩展方法和其他出色的功能。 您可以在GitHub上找到源代码 。

Java 8 Goodie:Lambda和排序

排序数组和集合是Java 8 lambda表达式的绝佳用例,原因很简单,因为Comparator自从JDK 1.2引入以来一直都是@FunctionalInterface 。 现在,我们可以将lambda表达式形式的Comparators提供给各种sort()方法。

对于以下示例,我们将使用此简单的Person类:

static class Person {final String firstName;final String lastName;Person(String firstName, String lastName) {this.firstName = firstName;this.lastName = lastName;}@Overridepublic String toString() {return "Person{" +"firstName='" + firstName + '\'' +", lastName='" + lastName + '\'' +'}';}
}

显然,我们也可以通过使它实现Comparable来向Person添加自然排序,但是让我们关注外部Comparators 。 考虑以下Person列表,其名称是使用一些在线随机名称生成器生成的:

List<Person> people =
Arrays.asList(new Person("Jane", "Henderson"),new Person("Michael", "White"),new Person("Henry", "Brighton"),new Person("Hannah", "Plowman"),new Person("William", "Henderson")
);

我们可能想按姓氏然后按名字对它们进行排序。

用Java 7排序

这样的Comparator器的一个“经典” Java 7示例是这样的:

people.sort(new Comparator<Person>() {@Overridepublic int compare(Person o1, Person o2) {int result = o1.lastName.compareTo(o2.lastName);if (result == 0)result = o1.firstName.compareTo(o2.firstName);return result;}
});
people.forEach(System.out::println);

以上将产生:

Person{firstName='Henry', lastName='Brighton'}
Person{firstName='Jane', lastName='Henderson'}
Person{firstName='William', lastName='Henderson'}
Person{firstName='Hannah', lastName='Plowman'}
Person{firstName='Michael', lastName='White'}

用Java 8排序

现在,让我们将以上内容翻译为等效的Java 8代码:

Comparator<Person> c = (p, o) ->p.lastName.compareTo(o.lastName);c = c.thenComparing((p, o) ->p.firstName.compareTo(o.firstName));people.sort(c);
people.forEach(System.out::println);

结果显然是相同的。 如何阅读以上内容? 首先,我们为本地Person Comparator变量分配一个lambda表达式:

Comparator<Person> c = (p, o) ->p.lastName.compareTo(o.lastName);

与Scala,C#或Ceylon不同,它们通过val关键字(或类似关键字) 知道从表达式到局部变量声明的类型推断,而Java从变量(或参数,成员)声明向要分配的表达式执行类型推断。

换句话说,类型推断是从“左到右”而不是从“右到左”执行的。 这使得链接Comparators有点麻烦,因为Java编译器无法将lambda表达式的类型推断延迟到将比较器传递给sort()方法之前。

但是,一旦为变量分配了Comparator ,就可以通过thenComparing()流畅地链接其他比较器:

c = c.thenComparing((p, o) ->p.firstName.compareTo(o.firstName));

最后,我们将其传递给List的新sort()方法,这是直接在List接口上实现的默认方法:

default void sort(Comparator<? super E> c) {Collections.sort(this, c);
}

上述限制的解决方法

虽然Java的类型推断“局限性”可能会让人感到沮丧,但我们可以通过创建通用的IdentityComparator来解决类型推断:

class Utils {static <E> Comparator<E> compare() {return (e1, e2) -> 0;}
}

使用上面的compare()方法,我们可以编写以下流畅的比较器链:

people.sort(Utils.<Person>compare().thenComparing((p, o) -> p.lastName.compareTo(o.lastName)).thenComparing((p, o) -> p.firstName.compareTo(o.firstName))
);people.forEach(System.out::println);

提取密钥

这可以变得更好。 由于我们通常从两个Comparator参数比较相同的POJO / DTO值,因此我们可以通过“键提取器”功能将它们提供给新的API。 它是这样工作的:

people.sort(Utils.<Person>compare().thenComparing(p -> p.lastName).thenComparing(p -> p.firstName));
people.forEach(System.out::println);

因此,在给定Person p我们为API提供了提取例如p.lastName 。 实际上,一旦我们使用了键提取器,我们就可以省略自己的实用程序方法,因为这些库还有一个comparing()方法来初始化整个链:

people.sort(Comparator.comparing((Person p) -> p.lastName).thenComparing(p -> p.firstName));
people.forEach(System.out::println);

同样,我们需要帮助编译器,因为它不能推断所有类型,即使原则上在这种情况下sort()方法将提供足够的信息。 要了解有关Java 8的通用类型推断的更多信息,请参见我们以前的博客文章 。

结论

与Java 5一样,可以在JDK库中看到升级的最大改进。 当Java 5为Comparators带来类型安全性时,Java 8使它们易于读取和编写(给出或接受奇数类型推理怪癖)。

Java 8将彻底改变我们编程的方式,下周,我们将看到Java 8如何影响我们与SQL交互的方式。

参考: Java 8 Friday Goodies:Lambda和Sorting,来自我们的JCG合作伙伴 Lukas Eder,在Java,SQL和JOOQ博客中。

翻译自: https://www.javacodegeeks.com/2014/02/java-8-friday-goodies-lambdas-and-sorting.html

q7goodies事例

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

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

相关文章

mysql存储过程语法 if_mysql存储过程语法 if

MySql存储过程MySQL 存储过程是从 MySQL 5.0 开始增加的新功能。存储过程的优点有一箩筐。不过最主要的还是执行效率和SQL 代码封装。特别是 SQL 代码封装功能&#xff0c;如果没有存储过程&#xff0c;在外部程序访问数据库时(例如 PHP)&#xff0c;要组织很多 SQL 语句。特别…

服务器突然关机的操作系统日志,一台R410 服务器不定时宕机,系统日志只有“上一次系统是意外关闭”...

R410环境操作系统 windows server 2008 r2 (一开始是windows server 2003)两个CPU&#xff1a;E5504内存&#xff1a;64G (4条16GB)故障现象&#xff1a;一开始运行windows server 2003也是不定时宕机&#xff0c;后由于业务需要更换为windows server 2008 r2还是不定时宕机&am…

什么是模拟量光端机?模拟光端机品牌有哪些?

模拟光端机采用了 PFM 调制技术实时传输图象信号。发射端将模拟视频信号先进行 PFM 调制后&#xff0c;再进行电-光转换&#xff0c;光信号传到接收端后&#xff0c;进行光电转换&#xff0c;然后进行 PFM 解调&#xff0c;恢复出视频信号。由于采用了PFM 调制技术&#xff0c;…

使用Spring Boot 2通过OAuth2和JWT进行集中授权

本指南逐步介绍了使用Spring Boot 2创建集中式身份验证和授权服务器的过程&#xff0c;还将提供演示资源服务器。 如果您不熟悉OAuth2&#xff0c;建议您阅读此书。 先决条件 JDK 1.8 文本编辑器或您喜欢的IDE Maven 3.0 实施概述 对于这个项目&#xff0c;我们将通过Sprin…

什么是物理隔离?物理隔离光端机是什么?

什么是物理隔离&#xff1f; 物理隔离&#xff0c;是指采用物理方法将内网与外网隔离从而避免入侵或信息泄露的风险的技术手段。物理隔离主要用来解决网络安全问题的&#xff0c;尤其是在那些需要绝对保证安全的保密网&#xff0c;专网和特种网络与互联网进行连接时&#xff0c…

linux mysql make_二、linux-mysql -cmake方式安装mysql 5.5

1.安装解压cmake包cmake软件cd /home/oldboy/tools/tar xf cmake-2.8.8.tar.gzcd cmake-2.8.8./configure#CMake has bootstrapped. Now run gmake.gmakegmake installcd ../2.依赖包yum install ncurses-devel -y3.安装mysql创建用户和组groupadd mysqluseradd mysql -s /sbi…

【渝粤教育】国家开放大学2018年春季 7405-21T面向对象程序设计(本) 参考试题

科目编号&#xff1a;7405 座位号 2018-2019学年度第二学期期末考试 面向对象程序设计&#xff08;本&#xff09; 试题 2018年 7 月 一、单选题&#xff08;本大题共10小题&#xff0c;每小题3分&#xff0c;共计30分&#xff09; &#xff08;★请考生务必将答案填入到下面对…

太极虚拟服务器,太极 中标 云服务器

太极 中标 云服务器 内容精选换一换华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用华为云服务。云服务器组是对云服务器的一种逻辑划分&#xff0c;云服务器组…

【渝粤教育】国家开放大学2018年春季 8617-21T燃气仪表与自动化 参考试题

科目编号&#xff1a;8617 座位号 2017-2018学年度第二学期期末考试 燃气仪表与自动化 试题 2018年 7月 一、填空题&#xff08;本大题共10空&#xff0c;每空3分&#xff0c;共计30分&#xff09; 1&#xff0e;目前市场上比较著名的软件系统集成平台有 、 、及 。 2&#xf…

什么是自愈环网光端机?

对于光端机这块&#xff0c;相信大家都有所了解。但是&#xff0c;什么是自愈环网光端机呢&#xff1f;想必很多朋友对此不是很了解&#xff0c;相信大家可能会很感兴趣了解下自愈环网光端机吧。接下来就由飞畅科技的小编来为大家详细介绍下什么是自愈环网光端机吧&#xff0c;…

gui界面怎么分页_什么是用户界面和体验设计

本文译自 Mikos Philips 的 UI vs UX  —  A Guide to UI Design因为发现仍然有小伙伴跑来问我比较基础的专业划分问题&#xff0c;所以翻译了这篇科普文。——用户界面&#xff08;UI, User Interface&#xff09;设计是设计软件产品所涉及到的几个交叉学科之一。不论是用户…

【渝粤教育】国家开放大学2018年春季 8638-22T薪酬制度与薪酬管理 参考试题

科目编号&#xff1a;8638 座位号 2017-2018学年度第二学期期末考试 薪酬制度与薪酬管理 试题 2018年 7 月 一、单选题&#xff08;本大题共10小题&#xff0c;每小题3分&#xff0c;共计30分&#xff09; &#xff08;★请考生务必将答案填入到下面对应序号的答题框中★&…

无忧无盘服务器,无忧网维无盘系统新手快速部署.doc

无忧网维无盘系统新手快速部署新手上路之无忧无盘系统快速部署无忧无盘系统支持控制台管理多台无盘服务器&#xff0c;进行远程操作统一管理。与其他的无盘系统不同&#xff0c;第一步需要新添加无盘服务器具体步骤&#xff1a;&#xff11;) 添加无盘服务器??操作步骤1)? ?…

詹金斯搭建_与詹金斯一起连续交付Heroku

詹金斯搭建如果您安装了Jenkins Git插件&#xff0c;那么利用Jenkins并针对Heroku的连续交付管道的设置就非常简单。 通过此管道&#xff0c;对特定Git分支的更改将导致Heroku部署。 为了使此部署过程正常运行&#xff0c;您应该至少使用两个Git分支&#xff0c;因为您希望有一…

【渝粤教育】国家开放大学2018年春季 0025-21T数据结构 参考试题

编号&#xff1a;0025 座位号&#xff1a; 17-18学年第1学期期末考试 数据结构 试题 一、选择题&#xff1a;&#xff08;每题4分&#xff0c;共20分&#xff09; 1&#xff0e;假定一个顺序队列的队首和队尾指针分别为front和rear&#xff0c;存放该队列的数组长度为N&#…

工业交换机品牌选择时注意的事项介绍

杭州飞畅科技有限公司是一家致力于光纤传输设备、数据通信设备及网络接入设备为主的集研发、生产、销售和服务为一体的高新技术企业&#xff0c;公司自成立以来就开始研发生产安防通信产品&#xff0c;采用高稳定性的通信技术制造安防产品&#xff0c;使得安防产品的稳定性极高…

【渝粤教育】国家开放大学2018年春季 0675-21T中级财务会计(2) 参考试题

科目编号&#xff1a;0675 座位号 2017-2018学年度第二学期期末考试 中级财务会计&#xff08;2&#xff09; 试题 2018年 7 月 一、单选题&#xff08;本大题共10小题&#xff0c;每小题3分&#xff0c;共计30分&#xff09; &#xff08;★请考生务必将答案填入到下面对应序…

使用Spring Boot和MongoDB构建一个反应式应用程序

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 如果您要处理大量流数据&#xff0c;反应式应用程序可让您更好地扩展。 它们是非阻塞…

c语言 freopen txt_C语言:freopen函数

当我们求解acm题目时&#xff0c;通常在设计好算法和程序后&#xff0c;要在调试环境(例如VC等)中运行程序&#xff0c;输入测试数据&#xff0c;当能得到正确运行结果后&#xff0c;才将程序提交到oj中。但由于调试往往不能一次成功&#xff0c;每次运行时&#xff0c;都要重新…

工业交换机如何判断性能的好坏呢?

当前的智能控制系统和工厂自动化系统常常采用工业交换机完成工业控制任务&#xff0c;工业以太网的应用非常普及。对于工业交换机的选购&#xff0c;把握工业交换机的主要性能指标是关键。那么&#xff0c;工业交换机如何判断性能的好坏呢&#xff1f;接下来就由飞畅科技的小编…