jdk 细粒度锁

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

jdk 细粒度锁

jdk 细粒度锁_使用JDK 8轻松进行细粒度排序相关推荐

  1. jdk说明文档_给JDK报了一个P4的Bug,结果居然……

    (给ImportNew加星标,提高Java技能) 作者:程序猿石头/码农唐磊(本文来自作者投稿) 背景 分享一下之前踩的一个坑,背景是这样的: 我们的项目依赖于一个外部服务,该外部服务提供 REST ...

  2. jdk安装教程_在JDK 12精简数字格式中使用最小分数数字

    jdk安装教程 帖子"紧凑数字格式出现在JDK 12中"演示了对JDK 12中NumberFormat的支持,以支持紧凑数字格式. 该帖子中显示的示例仅使用NumberFormat ...

  3. jdk安装教程_使用JDK 8流在包装对象的集合和包装对象的集合之间转换

    jdk安装教程 我发现使用基于Java的应用程序时,装饰器和适配器有时会很有用. 这些"包装器"在各种情况下都可以很好地工作,并且相当容易理解和实现,但是当需要包装对象的层次结构而 ...

  4. java jdk设置字符集_使用JDK 11在Java字符串上的新方法

    java jdk设置字符集 Java的String类似乎将在JDK 11中获得一些新方法,该方法将于2018年9月发布. 错误号 错误标题 新的String方法 描述 JDK-8200425 字符串: ...

  5. 细粒度图像分类_北大提出PKU FG-XMedia:细粒度跨媒体检索数据集和评测基准

    北京大学彭宇新教授团队建立了第一个包含 4 种媒体类型(图像.文本.视频和音频)的细粒度跨媒体检索公开数据集和评测基准 PKU FG-XMedia,并且提出了一种能够同时学习 4 种媒体统一表征的深度 ...

  6. java里class有什么用_安装JDK时的java和javac命令有什么用?

    相信大家都装过JDK吧,在装JDK时我们会在命令提示符窗口中通过java和javac两个命令来检测我们的环境变量是否配置正确,那么你知道java和javac两个命令有什么用吗? 在了解这两个命令的作用 ...

  7. jdk的安装路径在哪_忘记jdk安装路径怎么办

    1.开始->点击运行,输入:cmd2.然后在命令提示符中,输入:java-version假如看到有版本提示那么安装成功3.假如忘记了javajdk的安装路径,可在命令提示符中输入:. . 安装的 ...

  8. 虚拟linux jdk,虚拟机下Linux安装jdk

    1.利用共享文件夹复制本地硬盘下(H:/share)的压缩包到指定目录 cp jdk-8u161-linux-x64.tar.gz /soft/jdk 2.进入/soft/jdk目录下,解压jdk到当 ...

  9. eclipse包含jdk吗_eclipse安装教程jdk

    JDK是解析器,用来解析CLASS文件的.而ECLIPSE是用JAVA编写的集成开发系统.它有很多插件支持可以编写C/C++.JSP.XML.UML,是很强大的开发工具. . 你如果想运行JAVA文件 ...

最新文章

  1. MFC 重设对话框的尺寸
  2. Linux概念架构的理解
  3. SMARTFORM 循环打印实现 (循环调用SMARTFORM)
  4. C++类构造析构调用顺序训练(复习专用)
  5. python怎么输出结果_Python中print()常用输出方法
  6. 【nyoj - 252】 01串(简单dp)
  7. 在运行Loaded runtime CuDNN library: 7103 (compatibility version 7100) but source was compiled with 7003
  8. LFDMM源码剖析(融入词向量的概率图模型)
  9. HttpClient4文件上传
  10. buildroot 下载和make nconfig
  11. [20141121]无法通过powershell读取sql server性能计数器问题
  12. houdini pyro
  13. 东南计算机研究生英语免修条件,2017级硕士研究生英语免修总名单
  14. oracle 无效的窗口句柄 print spooler服务已开,win10系统下无法运行print spooler服务如何解决...
  15. leetcode79 word serach 解题报告
  16. MSDOS(MBR)和GPT磁盘分区表
  17. C# 按行读取txt记事本文件
  18. U盘无法与计算机连接,连接电脑后为什么u盘不显示 连接电脑后u盘不显示原因【图文】...
  19. redis内存回收——过期、淘汰
  20. 什么是链路追踪?分布式系统如何实现链路追踪?

热门文章

  1. P5787 二分图 /【模板】线段树分治(线段树分治、并查集)
  2. P7920-[Kubic]Permutation
  3. CF1511G-Chips on a Board【倍增】
  4. 牛客练习赛69D-火柴排队【dp】
  5. CF1066F-Yet another 2D Walking【贪心】
  6. YL杯超级篮球赛(jzoj 1325)
  7. 【DP】【高精】WZK打雪仗(jzoj 1997)
  8. 2019.01.28【NOIP普及组】模拟赛C组总结
  9. Spark SQL(八)之基于物品的相似度公式
  10. Java虚拟机是如何执行线程同步的