使用JDK 8轻松进行细粒度排序

Java的8的推出流和有用的静态 / 默认的方法比较接口可以很容易地根据个人的领域两个对象比较“值,而不需要实现一个比较(T,T)在其对象的类方法被比较。

我将使用一个简单的Song类来帮助演示这一点,接下来显示其Song.java代码清单。

Song.java

package dustin.examples.jdk8;/*** Simple class encapsulating details related to a song* and intended to be used for demonstration of JDK 8.*/
public class Song
{/** Song title. */private final String title;/** Album on which song was originally included. */private final String album;/** Song's artist. */private final String artist;/** Year song was released. */private final int year;/*** Constructor accepting this instance's title, artist, and release year.** @param newTitle Title of song.* @param newAlbum Album on which song was originally included.* @param newArtist Artist behind this song.* @param newYear Year song was released.*/public Song(final String newTitle, final String newAlbum,final String newArtist, final int newYear){title = newTitle;album = newAlbum;artist = newArtist;year = newYear;}public String getTitle(){return title;}public String getAlbum(){return album;}public String getArtist(){return artist;}public int getYear(){return year;}@Overridepublic String toString(){return "'" + title + "' (" + year + ") from '" + album + "' by " + artist;}
}

刚刚显示了清单的Song类缺少一个compare方法,但是我们仍然可以很容易地在JDK 8中比较该类的实例。 根据刚刚显示的Song的类定义,以下代码可用于根据歌曲发行年份,歌手和专辑的顺序对歌曲实例List进行排序。

按年份,艺术家和专辑对歌曲排序(按此顺序)

/*** Returns a sorted version of the provided List of Songs that is* sorted first by year of song's release, then sorted by artist,* and then sorted by album.** @param songsToSort Songs to be sorted.* @return Songs sorted, in this order, by year, artist, and album.*/
private static List<Song> sortedSongsByYearArtistAlbum(final List<Song> songsToSort)
{return songsToSort.stream().sorted(Comparator.comparingInt(Song::getYear).thenComparing(Song::getArtist).thenComparing(Song::getAlbum)).collect(Collectors.toList());
}

如果我静态地导入 ComparatorCollectors ,则上面的代码清单将稍微冗长一些,但是将这些接口和类名称包括在清单中仍然很简洁,对于该主题的入门博客文章可能更有用。

在上面的代码清单中, static default方法Comparator.comparingInt和Comparator.thenComparing用于按年份,然后是艺术家,最后是唱片,对与基础List关联的Song流进行排序。 该代码具有很高的可读性,并且可以基于任意单独的访问器方法进行对象比较(以及对这些实例进行排序),而无需显式指定的Comparator (用于每个比较的访问器结果的自然排序顺序)。 请注意,如果需要显式Comparator ,则可以通过接受Comparator的同名重载方法将其提供给这些static default方法。

下一个代码清单是整个演示类。 它包括刚刚显示的方法,还显示了由未排序的歌曲List构成的人为示例。

FineGrainSortingDemo.java

package dustin.examples.jdk8;import static java.lang.System.out;import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;/*** Demonstration of easy fine-grained sorting in JDK 8 via* stream support for sorting and Comparator's static and* default method implementations.*/
public class FineGrainSortingDemo
{/*** Construct List of {@code Song}s.* * @return Instances of {@code Song}.*/private static List<Song> generateSongs(){final ArrayList<Song> songs = new ArrayList<>();songs.add(new Song("Photograph","Pyromania","Def Leppard",1983));songs.add(new Song("Hysteria","Hysteria","Def Leppard",1987));songs.add(new Song("Shout","Songs from the Big Chair","Tears for Fears",1984));songs.add(new Song("Everybody Wants to Rule the World","Songs from the Big Chair","Tears for Fears",1985));songs.add(new Song("Head Over Heels","Songs from the Big Chair","Tears for Fears",1985));songs.add(new Song("Enter Sandman","Metallica","Metallica",1991));songs.add(new Song("Money for Nothing","Brothers in Arms","Dire Straits",1985));songs.add(new Song("Don't You (Forget About Me)","A Brass Band in African Chimes","Simple Minds",1985));return songs;}/*** Returns a sorted version of the provided List of Songs that is* sorted first by year of song's release, then sorted by artist,* and then sorted by album.** @param songsToSort Songs to be sorted.* @return Songs sorted, in this order, by year, artist, and album.*/private static List<Song> sortedSongsByYearArtistAlbum(final List<Song> songsToSort){return songsToSort.stream().sorted(Comparator.comparingInt(Song::getYear).thenComparing(Song::getArtist).thenComparing(Song::getAlbum)).collect(Collectors.toList());}/*** Demonstrate fine-grained sorting in JDK 8.** @param arguments Command-line arguments; none expected.*/public static void main(final String[] arguments){final List<Song> songs = generateSongs();final List<Song> sortedSongs = sortedSongsByYearArtistAlbum(songs);out.println("Original Songs:");songs.stream().forEach(song -> out.println("\t" + song));out.println("Sorted Songs");sortedSongs.forEach(song -> out.println("\t" + song));}
}

接下来显示运行上述代码的输出,并在使用排序代码后列出新排序的Song 。 值得注意的是,此stream.sorted()操作不会更改原始List (它作用于流而不是List )。

Original Songs:'Photograph' (1983) from 'Pyromania' by Def Leppard'Hysteria' (1987) from 'Hysteria' by Def Leppard'Shout' (1984) from 'Songs from the Big Chair' by Tears for Fears'Everybody Wants to Rule the World' (1985) from 'Songs from the Big Chair' by Tears for Fears'Head Over Heels' (1985) from 'Songs from the Big Chair' by Tears for Fears'Enter Sandman' (1991) from 'Metallica' by Metallica'Money for Nothing' (1985) from 'Brothers in Arms' by Dire Straits'Don't You (Forget About Me)' (1985) from 'A Brass Band in African Chimes' by Simple Minds
Sorted Songs'Photograph' (1983) from 'Pyromania' by Def Leppard'Shout' (1984) from 'Songs from the Big Chair' by Tears for Fears'Money for Nothing' (1985) from 'Brothers in Arms' by Dire Straits'Don't You (Forget About Me)' (1985) from 'A Brass Band in African Chimes' by Simple Minds'Everybody Wants to Rule the World' (1985) from 'Songs from the Big Chair' by Tears for Fears'Head Over Heels' (1985) from 'Songs from the Big Chair' by Tears for Fears'Hysteria' (1987) from 'Hysteria' by Def Leppard'Enter Sandman' (1991) from 'Metallica' by Metallica

JDK 8在接口中引入了流以及默认方法和静态方法(在这种情况下,尤其是在Comparator上),可以轻松地按期望的顺序逐个字段地比较两个对象,而无需使用任何显式的Comparator而是预先构建了static default方法。 Comparator界面(如果要比较的字段具有所需的自然顺序)。

翻译自: https://www.javacodegeeks.com/2018/01/easy-fine-grained-sorting-jdk-8.html

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

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

相关文章

主成分分析以及应用:企业综合实力排序

这段时间一直在学习数据挖掘的一些算法&#xff0c;今天通过不断查阅资料&#xff0c;学习整理了一下主成分分析这个数据降维算法。并且结合一个实例进行matlab编程实现。 主成分基本原理 在数据挖掘中&#xff0c;经常会遇到一个问题就是一个问题出现了n多个变量&#xff0c;…

自定义MongoDB的Spring Social Connect框架

在上一篇文章中 &#xff0c;我谈到了我面临的第一个挑战是更改数据模型并添加连接框架。 在这里&#xff0c;我想提供有关我如何做的更多详细信息。 Spring Social项目已经提供了基于jdbc的连接存储库实现&#xff0c;以将用户连接数据持久保存到关系数据库中。 但是&#xff…

算法题:输入aaaabbbcccccc输出a4b3c6。

今日在地铁上浏览今日头条的时候看到这么个小题目&#xff0c;说是输出一长串字符串&#xff0c;输出字母串类别并且统计其出现次数&#xff0c;然后按照顺序将其输出来。例如输入aaaabbbcccccc&#xff0c;输出a4b3c6。 最近也一直在学习&#xff0c;所以就想着就Matlab来试了…

Java World中的GraphQL简介

许多人认为GraphQL仅适用于前端和JavaScript&#xff0c;它在Java等后端技术中没有定位&#xff0c;但事实确实如此。 还经常将GraphQL与REST进行比较&#xff0c;但是这种比较是否合理&#xff1f; 首先&#xff0c;让我开始回答其中最重要的问题。 什么是GraphQL&#xff1…

算法题:在一个字符串中找到只出现一次的字符。如输入abaccdeeff,则输出bd。

今天的算法学习还是和字符串有关&#xff0c;这个题目据说是以前的某公司面试的笔试题目。题目意思就是说&#xff0c;在一个字符串中找到只出现了一次的那些字符&#xff0c;并且输出来。 作为非IT的我&#xff0c;平时使用Matlab比较多。不是科班出身&#xff0c;对于这个题…

Kafka的Spring Cloud Stream

总览 该示例项目演示了如何使用事件驱动的体系结构 &#xff0c; Spring Boot &#xff0c;Spring Cloud Stream&#xff0c; Apache Kafka和Lombok构建实时流应用程序。 在本教程结束时&#xff0c;您将运行一个简单的基于Spring Boot的Greetings微服务 从REST API获取消息 …

使用JShell的Java 9 Streams API

这篇文章着眼于使用JShell的Java 9 Streams API。 Streams API的更改以Java 8中Streams的成功为基础&#xff0c;并引入了许多实用程序方法– takeWhile&#xff0c;dropWhile和iterate。 这篇文章延续了My Top Java 9功能&#xff0c;并使用Jshell探索了这些方法。 流API Str…

常见的股票技术因子学习以及计算

最近在看《量化投资数据挖掘技术与实践&#xff08;MATLAB版&#xff09;》。学习了其中的常见的股票衍生变量&#xff0c;并且利用WIND金融数据终端的matlab借口windmatlab导出一些数据进行了一个简单的学习。特此记录。 下面是我对于书中提到的几个因子的学习总结&#xff1…

算法题:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串“12345”,则输出整数“12345”

今天这道算法题比较简单&#xff0c;主要考察的思考问题的全面性。这个需要考虑的几种情况。 如果输入的整数字符串是个负数&#xff0c;怎么处理&#xff1f; 如果输入的第一个字符是0&#xff0c;则怎么处理&#xff1f; 如果输入的是非0~9之间的字符怎么处理&#xff1f;…

排序算法一:冒泡排序,插入排序以及选择排序原理与MATLAB实现

最近在学习排序算法的一些知识。还是比较有趣的。所以好好研究了一下各个算法。并且使用matlab进行了个基本的实现&#xff0c;目前仅仅是实现吧&#xff0c;优化什么的可能目前的水平达不到吧&#xff0c;毕竟是用matlab实现&#xff0c;还是比较简单。以后还是希望使用C/C&am…

Java – HashMap详细说明

HashMap基于哈希算法工作&#xff0c;根据Java文档HashMap具有以下四个构造函数&#xff0c; 建设者 描述 HashMap ​() 构造一个空的 具有默认初始容量&#xff08;16&#xff09;和默认加载因子&#xff08;0.75&#xff09;的HashMap 。 HashMap ​(int initialCapaci…

Python实现石头-剪刀-布小游戏

近日在学习Python的一些基础知识&#xff0c;觉得还是很有趣的一个一门语言&#xff01;就目前的学习的一些知识&#xff0c;编写了一些一个简单的石头剪刀布的游戏。主要是熟悉一些Python的一些控制语句。 import random while 1:sint(random.randint(1,3))print(s)print()if…

Python:递归输出斐波那契数列

今天学习Python的时候做一道练习题&#xff0c;题目是这样的&#xff1a; 题目 导入 问题 有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子总对数为多…

Spring Webflux –编写过滤器

Spring Webflux是Spring 5的一部分提供的新的响应式Web框架。 在传统的基于Spring MVC的应用程序&#xff08; Servlet Filter &#xff0c; HandlerInterceptor &#xff09;中编写过滤器的方式与在基于Spring Webflux的应用程序中编写过滤器的方式非常不同&#xff0c;本文将…

排序算法二:快速排序算法原理以及MATLAB与Python实现

今天继续学习排序算法。今天的主角是快速排序算法。 1. 快速排序基本原理 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略&#xff0c;通常称其为分治法(Divide-and-ConquerMethod)。 该方法的基本思想是&#xff1a; 1&#xff0e;先从数列…

排序算法三:堆排序基本原理以及Python实现

1. 基本原理 堆排序就是利用堆的特性进行一个无序序列的排序工作。 堆的特点 堆分为最大堆和最小堆&#xff0c;其实就是完全二叉树。 最大堆要求节点的元素都要不小于其孩子最小堆要求节点元素都不大于其左右孩子。 两者对左右孩子的大小关系不做任何要求&#xff0c;其实…

spring jms 消息_Spring JMS,消息自动转换,JMS模板

spring jms 消息在我的一个项目中&#xff0c;我应该创建一个消息路由器&#xff0c;就像所有路由器一样&#xff0c;它应该从一个主题获取JMS消息并将其放入另一个主题。 该消息本身是JMS文本消息&#xff0c;实际上包含XML消息。 收到消息后&#xff0c;我还应该添加一些其他…

排序算法四:归并排序基本原理以及Python实现

1. 基本原理 归并排序建立在归并操作上的一种算法。该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。归并排序是将两 个已经有序的序列合成一个有序的序列的过程。 因此&#xff0c;对于一个待排序的序列来说&#xff0c;首先要将其进行…

如何将JAR添加到Jetbrains MPS项目

Jetbrains MPS是创建DSL的绝佳工具。 我们喜欢它&#xff0c;并在我们的咨询工作中定期使用它。 因此&#xff0c;我们之前已经写过关于Jetbrains MPS的文章 。 作为投影编辑器&#xff0c;您可以轻松创建可通过图形界面或数学公式之类使用的DSL。 尽管所有这些功能都需要做一…

Python 3实现k-邻近算法以及 iris 数据集分类应用

前言 这个周基本在琢磨这个算法以及自己利用Python3 实现自主编程实现该算法。持续时间比较长&#xff0c;主要是Pyhton可能还不是很熟练&#xff0c;走了很多路&#xff0c;基本是一边写一边学。不过&#xff0c;总算是基本搞出来了。不多说&#xff0c;进入正题。 1. K-邻近…