Java 8:对集合中的值进行排序

意识到Java 8将在接下来的几周内发布其GA版本之后,我认为现在是时候来看看它了,在过去的一周里,我一直在阅读Venkat Subramaniam的书 。

我要讲的是第3章,其中涉及对人员集合进行排序。 Person类的定义大致如下:

static class Person {private String name;private int age;Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return String.format("Person{name='%s', age=%d}", name, age);}
}

在第一个示例中,我们列出了人员列表,然后按年龄升序对其进行了排序:

List<Person> people = Arrays.asList(new Person("Paul", 24), new Person("Mark", 30), new Person("Will", 28));
people.stream().sorted((p1, p2) -> p1.age - p2.age).forEach(System.out::println);
Person{name='Paul', age=24}
Person{name='Will', age=28}
Person{name='Mark', age=30}

如果我们要编写一个函数来在Java 7中做同样的事情,它将看起来像这样:

Collections.sort(people, new Comparator<Person>() {@Overridepublic int compare(Person o1, Person o2) {return o1.age - o2.age;}
});for (Person person : people) {System.out.println(person);
}

Java 8减少了我们必须编写的代码量,尽管它比我们在Ruby中所能完成的还要复杂:

> people = [ {:name => "Paul", :age => 24}, {:name => "Mark", :age => 30}, {:name => "Will", :age => 28}]
> people.sort_by { |p| p[:age] }
=> [{:name=>"Paul", :age=>24}, {:name=>"Will", :age=>28}, {:name=>"Mark", :age=>30}]

几页后,Venkat展示了如何使用Comparator#comparing函数来接近这一点:

Function<Person, Integer> byAge = p -> p.age ;
people.stream().sorted(comparing(byAge)).forEach(System.out::println);

我以为可以通过内联'byAge'lambda来简化此过程:

people.stream().sorted(comparing(p -> p.age)).forEach(System.out::println);

尽管IntelliJ 13.0提示存在“ 循环推断 ”问题,但这似乎可以正确编译并运行。 如果我们像下面这样显式地转换lambda,则IntelliJ很高兴:

people.stream().sorted(comparing((Function<Person, Integer>) p -> p.age)).forEach(System.out::println);

如果我们在lambda中显式键入'p',IntelliJ似乎也很高兴,所以我认为我暂时会使用它:

people.stream().sorted(comparing((Person p) -> p.age)).forEach(System.out::println);

参考: Java 8:在Mark Needham博客博客中对来自JCG合作伙伴 Mark Needham的集合中的值进行排序 。

翻译自: https://www.javacodegeeks.com/2014/02/java-8-sorting-values-in-collections.html

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

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

相关文章

html的table弹窗_Js弹出基于Table的可关闭浮动层

可以拖动和隐藏的层&#xff0c;替代弹出窗口isIEdocument.all;isNN!document.all&&document.getElementById;isN4document.layers;isHotfalse;function ddInit(e){topDogisIE ? "BODY" : "HTML";whichDogisIE ? document.all.theLayer : docume…

Linux装ntfs后内存不够,Linux_安装Ubuntu后无法使用NTFS硬盘或移动硬盘,  在安装Ubuntu系统后,存在 - phpStudy...

安装Ubuntu后无法使用NTFS硬盘或移动硬盘在安装Ubuntu系统后&#xff0c;存在无法使用NTFS硬盘或移动硬盘的问题&#xff0c;下面小编就给大家介绍下Ubuntu系统无法挂载NTFS的解决方法&#xff0c;不知如何挂载的朋友不妨来了解下。具体问题如下图所示&#xff1a;“Please res…

TJOI2018Party

题目描述 小豆参加了\(NOI\)的游园会&#xff0c;会场上每完成一个项目就会获得一个奖章&#xff0c;奖章 只会是\(N\), \(O\), \(I\)的字样。在会场上他收集到了\(K\)个奖章组成的串。 兑奖规则是奖章串和兑奖串的最长公共子序列长度为小豆最后奖励的等级。 现在已知兑奖串长度…

HTML5 Dashboard – 那些让你激动的 Web 技术

HTML5 Dashboard 是一个 Mozilla 推出的项目&#xff0c;里面展示了最前沿的 HTML5&#xff0c;CSS3&#xff0c;JavaScript 技术。每一项技术都有简洁&#xff0c;在线演示以及详细的文档链接。这些技术将成为未来一段时间 Web 开发的顶尖技术&#xff0c;如果不想落伍的话就赶…

通过自动回复机器人学Mybatis---基础版

第1章 案例简介 介绍要实现的案例情况&#xff0c;后面会通过这个案例来学习 Mybatis第2章 实战第一部----黎明前的黑暗 在没有 Mybatis 的情况下&#xff0c;使用 Jsp Servlet Jdbc 实现案例中的一个模块开发流程1&#xff1a; 开发流程2&#xff1a; 开发流程3&#xff1a;…

部署到Maven中央存储库

您需要使您的Java库公开访问吗&#xff1f; 您的项目托管在GitHub上吗&#xff1f; 您是否喜欢“将所有功能都部署到Maven Central Repository”按钮的想法&#xff1f; 我将展示如何使用maven-release-plugin进行设置 。 源代码托管在GitHub上&#xff0c;因此还将描述对源代码…

Scroll Depth – 衡量页面滚动的 Google 分析插件

Scroll Depth 是一个小型的 Google Analytics&#xff08;谷歌分析&#xff09;插件&#xff0c;可以让你衡量用户在页面上滚动了多远。它可以监控 25%、50%、75% 和 100% 四个滚动点&#xff0c;并发送谷歌分析事件。 您还可以跟踪页面上的特定元素是否滚动到视图中。例如在博…

aws ec2时间_AWS中自动化的三大领域,以避免支付过多的云账单

AWS是全球最常用的云服务之一。 Gartner Magic Quadrant将AWS评为最大的IaaS提供商。每个可能的域都由企业使用AWS服务。 全球约有 1,000,000家公司正在使用AWS作为其IaaS提供商。从Netflix到Unilever再到Met Office&#xff0c;每个人都转移到AWS上的云基础架构。既然您正在阅…

linux vector 头文件,LINUX 之Vector用法

在Linux开发过程中常用到的一个功能----列表显示.如何将中心数据进行列表显示呢?这里就用到了VECTOR容器.从中心获取的数据通过VECTOR容器传输给站点程序从而实现批量数据的传输.VECTOR容器常用的函数包括以下几个1.push_back函数函数原型:void push_back(const T& x);实现…

MySQl的一些基本知识(1)

数据库优化操作&#xff1a; MySQL优化 数据库优化维度有四个: 硬件、系统配置、数据库表结构、SQL及索引 优化成本: 硬件>系统配置>数据库表结构>SQL及索引 优化效果: 硬件<系统配置<数据库表结构<SQL及索引 运行机制原理和底层架构 MySQL的查询优化&#x…

将一个word文档按一页或多页拆分成多个文档

工作中&#xff0c;有时候碰到需要将一个比较大的word按照指定的页数分割成若干个小的word文档&#xff0c;下面提供分割的方法供参考&#xff1a; 一、按照单页拆分 1、在Word里面打开那个需要分割的文档&#xff08;假设它的文件名叫做“test.doc”&#xff09;&#xff1b; …

Croppic – 免费开源的 jQuery 图片裁剪插件

Croppic 这款开源的 jQuery 图片裁剪插件能够满足网站开发人员各种不同的使用需要。只需要简单的上传图片&#xff0c;就可以实现你想要的图像缩放和裁剪功能。因为使用了 HTML5 FormData 对象&#xff0c;所以目前只支持 IE 10 、Chrome 和 Firefox 等现代浏览器。 您可能感兴…

应用面向方面的编程

1.引言 面向方面的编程的主要目标是将跨领域的关注点分离。 当我们谈论跨领域的关注时&#xff0c;我们指的是在我们的系统或应用程序中的多个地方使用的通用功能。 这些概念包括&#xff1a; 记录中 交易管理 错误处理 监控方式 安全 实现这种分离的方法是将这些概念模块…

最大连续子序列----DP动态规划

1196: 最大连续子序列 时间限制: 1 Sec 内存限制: 128 MB提交: 44 解决: 20[提交][状态][讨论版] 题目描述 给定 K 个整数的序列{ N1, N2, ..., NK } &#xff0c;其任意连续子序列可表示为{ Ni, Ni1,...,Nj} &#xff0c;其中1 < i< j < K。最大连续子序列是所有…

linux钟java运行命令,在java中运行linux命令

我想在java中运行“ls”命令&#xff0c;我的代码是- 注意&#xff1a; - 我正在使用WINDOWS。在java中运行linux命令import java.io.IOException;public class Example{public void fn(){Runtime run Runtime.getRuntime();Process p null;String cmd "ls";try {…

python3seek_Python seek()和tell()函数详解

在讲解 seek() 函数和 tell() 函数之前&#xff0c;首先来了解一下什么是文件指针。我们知道&#xff0c;使用 open() 函数打开文件并读取文件中的内容时&#xff0c;总是会从文件的第一个字符(字节)开始读起。那么&#xff0c;有没有办法可以自定指定读取的起始位置呢&#xf…

n=n+1 放在print(s)的前/后的影响

# 123456.....100 ?#关键在于,当n为时,才print(s)n 1s 0while n < 101: s s n if n 100: #关键在于这一步, 我用if来判断,当n为100时,才print(s), 否则继续while循环 print(s) n n 1          转载于:https://www.cnblogs.co…

ScrollReveal.js – 帮助你实现超炫的元素运动效果

ScrollReveal.js 用于创建和管理元素进入可视区域时的动画效果&#xff0c;帮助你的网站增加吸引力。只需要给元素增加 data-scrollreveal 属性&#xff0c;当元素进入可视区域的时候会自动被触发设置好的动画。 您可能感兴趣的相关文章2013年最受欢迎的10篇前端开发博文小伙伴…

JDBC布尔兼容性列表

有趣的是&#xff0c;布尔类型只是在SQL标准后期才引入&#xff0c;即SQL&#xff1a;1999 。 即使在今天&#xff0c;并非所有数据库本身都支持BOOLEAN或BIT类型。 最重要的是&#xff0c;我们仍然可以在Oracle中等待一段时间。 这是2002年以来关于该主题的“问汤姆”的观点&a…

linux用户操作的日志,linux 用户操作记录并录入日志

1. 添加bash全局配置文件&#xff1a;cd /etc/profile.dvi log_command.sh输入如下内容&#xff1a;export PROMPT_COMMAND‘RETRN_VAL$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\[ ]*//" ) [$RETRN_VAL]"‘2. 添加rsy…