比较器中的comparing方法以及涉及到的知识
今天在学习Java核心技术集合程序清单9-3时遇到了问题。 代码如下
public class TreeSetTest { public static void main(String[] args) {
SortedSet<Item> parts = new TreeSet<>();
parts.add(new Item("Toaster", 1234));
parts.add(new Item("Widget", 4562));
parts.add(new Item("Modem", 9912));
System.out.println(parts); NavigableSet<Item> sortByDescription = new TreeSet<Item>(Comparator.comparing(Item::getDescription)); sortByDescription.addAll(parts);
System.out.println(sortByDescription);
} }
public class Item implements Comparable<Item>{
private String description;
private int partNumber; public Item(String aDescroption,int aPartNumber) {
description = aDescroption;
partNumber = aPartNumber;
} public String getDescription() {
return description;
} public String toString() {
return "[description=" + description + ",partNumber=" + partNumber + "]";
} @Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Item other = (Item)obj;
return Objects.equals(description, other.description) && partNumber == other.partNumber;
} public int hasCode() {
return Objects.hash(description,partNumber);
} @Override
public int compareTo(Item o) {
int diff = Integer.compare(partNumber,o.partNumber);
return diff != 0 ? diff : description.compareTo(o.description); } }
可以看到,在主函数中定制了一个比较器来按照描述信息排序,在看这个比较器定义的源码时有些看不懂,所以回去查阅了关于lambda表达式、泛型等知识,在这里记录以下以便以后查阅
首先看源码
public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
Function<? super T, ? extends U> keyExtractor)
{
Objects.requireNonNull(keyExtractor);
return (Comparator<T> & Serializable)
(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}
在这里涉及到的知识点在下面一一解析
1,泛型
U extends Comparable<? super U>
在这里表示 U实现了Comparable接口,同时Comparable接口中的实例域是U的父类。
带有超类型super限定的通配符表示了域的下限,即可以接收U的超类的作为Comparable中参数的类型
带有子类型extends限定的通配符表示了U的上限,即U只能是实现了Comparable接口的子类。
2,函数式接口。 函数式接口是用来接收函数作为参数的,用于lambda
这里的Function是一个函数式接口,是Java给出的,表示有一个T类型参数的函数。原型是
Function<T,R>
T是参数类型,R是返回类型。Function接口自带一个apply方法,R apply(T) ,表示由T参数得到R的返回。
3,这里参数传入的是Item::getDescription,对应函数式接口Function,该函数的返回值String类型对应T,所以源码中的comparaTo对应的是String.comparaTo (String实现了Comparable)
所以这个比较器的结果也应当是按照字典顺序排序的。
这里return后面的括号中的(Comparator<T> & Serializable)我还不知道具体是什么意思,是强制类型转换吗? 如果有大佬看到我的文章请评论告知,万分感谢
比较器中的comparing方法以及涉及到的知识的更多相关文章
- Java中的equals方法和自定义比较器
Object中的equals()方法默认是按地址比较,而不按内容进行比较, public boolean equals(Object obj) { return (this == obj); } 在S ...
- 浅谈Java中的hashcode方法
哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...
- 解析Qt中QThread使用方法
本文讲述的是在Qt中QThread使用方法,QThread似乎是很难的一个东西,特别是信号和槽,有非常多的人(尽管使用者本人往往不知道)在用不恰当(甚至错误)的方式在使用QThread,随便用goog ...
- 【转】浅谈Java中的hashcode方法(这个demo可以多看看)
浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...
- OpenStack安装部署管理中常见问题解决方法
一.网络问题-network 更多网络原理机制可以参考<OpenStack云平台的网络模式及其工作机制>. 1.1.控制节点与网络控制器区别 OpenStack平台中有两种类型的物理节点, ...
- Web Api中实现Http方法(Put,Post,Delete)
在Web Api中实现Http方法(Put,Post,Delete) 系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在Web Api中,我 ...
- jQuery中的ready方法及实现按需加载css,js
模拟jQuery中的ready方法及实现按需加载css,js 一.ready函数的实现 经常用jQuery类库或其他类库中的ready方法,有时候想想它们到底是怎么实现的,但是看了一下jQuery中的 ...
- 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)
编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...
- Java——String类中的compareTo方法总结
String类的定义: java.lang 类 String java.lang.Object java.lang.String 所有已实现的接口:Serializable, C ...
随机推荐
- Int类的129为什么转成byte就变成-127了?
作为一个java开发人员,接触的基本都是上层的,都是以应用为主,根据业务实现功能,但今天无意间发现了一个小问题,int类型的129转成byte类型变成了-127,我知道是因为位数截取的原因,但是还没有 ...
- AWVS安全渗透扫描
1.打开软件,点击New Scan 2.在website url中输入被扫描的网址,点击next 3.在scanning profile中选择测试的漏洞类型,默认选择default(默认) 在scan ...
- 利用 js 的一些函数调用,排序
编辑器:Sublime Text 3 1.冒泡排序 let arr = new Array(5,9,3,6,7,8,4,2,);bubbleSort(arr);console.log(arr);fun ...
- [Quarks PwDump]Hash dump神器
好不好用就不用说了哈 记录下使用方式 也支持导出本地哈希.域控哈希等.配合hashcat神器 奇效. 它目前可以导出 : – Local accounts NT/LM hashes +history ...
- wwindows权限认识(用户及用户组)
windows权限认识(用户及用户组) Windows系统内置了许多本地用户组,这些用户组本身都已经被赋予一些权限(permissions),它们具有管理本地计算机或访问本地资源的权限.只要用户账户加 ...
- Hadoop和YARN :map+shuffle+reduce走读
今天做了一个hadoop分享,总结下来,包括mapreduce,及shuffle深度讲解,还有YARN框架的详细说明等. v\:* {behavior:url(#default#VML);} o\:* ...
- RequireJS 插件
网址:http://www.requirejs.cn/docs/api.html#i18n RequireJS的插件: Text:自动加载一些非js的文本文件. domReady:确保在Dom Rea ...
- JedisCluster与keys/scan查找
最近买了几个专栏,关于算法.JVM.redis,学不过来.主要是身体也不太好,视物光斑转头疼的问题出现越来越频繁.再加上早上起来嗓子痒打喷嚏.很烦. 稍记录一下redis集群的问题: 1.scan在集 ...
- C++中哪些函数不能声明为virtual?
首先要明确,virtual是用于支持类多态的关键字,所以出现在类声明之外的地方都是错误的.由此可以断定下文的1. 普通函数(即非类成员函数)不能是virtual的,否则不能通过编译,virtual只能 ...
- vue在一个方法执行完后再执行另一个方法
vue在一个方法执行完后执行另一个方法 用Promise来实现.Promise是ES6的新特性,用于处理异步操作逻辑,用过给Promise添加then和catch函数,处理成功和失败的情况 ES7中新 ...