接口Entry<K,V> 是Map<K,V>的内部接口,该接口是用来表示一个键值对的,一个这样的实例就包含K类型的键和V类型的值。包含获取Key、获取value以及设置value的方法,同时需要重写equals和hashCode方法。
该接口有四中方式获取比较器:
如果K类型或者V类型的父类包含K和V实现了Comparable接口,则可以通过下面方式获取比较器:
public static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K,V>> comparingByKey() {
return (Comparator<Map.Entry<K, V>> & Serializable)
(c1, c2) -> c1.getKey().compareTo(c2.getKey());
}
public static <K, V extends Comparable<? super V>> Comparator<Map.Entry<K,V>> comparingByValue() {
return (Comparator<Map.Entry<K, V>> & Serializable)
(c1, c2) -> c1.getValue().compareTo(c2.getValue());
}
如果K类型或者V类型的父类包含K和V没有实现Comparable接口,则需要对齐父类构建自定义比较器(Comparator<? super K> cmp):
public static <K, V> Comparator<Map.Entry<K, V>> comparingByKey(Comparator<? super K> cmp) {
Objects.requireNonNull(cmp);
return (Comparator<Map.Entry<K, V>> & Serializable)
(c1, c2) -> cmp.compare(c1.getKey(), c2.getKey());
}
public static <K, V> Comparator<Map.Entry<K, V>> comparingByValue(Comparator<? super V> cmp) {
Objects.requireNonNull(cmp);
return (Comparator<Map.Entry<K, V>> & Serializable)
(c1, c2) -> cmp.compare(c1.getValue(), c2.getValue());
}
}
通过这个例子我们也能够获取Comparator和Comparable的不同
网友评论