从Comparator接口的源码,可以看到Comparator接口中的方法有三类:

1 普通接口方法

2 default方法

3 static方法

其中default方法和static方法 是java8新加的特性,default方法提供了方法实现,不强制接口实现类实现。static相较于default方法可以在直接用“接口名.方法名”调用。

那么,Comparator接口的实现类应该实现其中的comparator方法和equals方法。

但是,由于接口(接口可以看做一种特殊的类)以及该接口的实现类都默认继承了Object类,在java代码编译为字节码的过程后,实际上equals方法都已经被实现,编译器也就不会认为Comparator接口的equals方法没有实现。

另外,一般来讲“接口是不能继承类的”,实际严格来说是接口不能显式地继承类,并且不是想类的继承那样逻辑,接口会自动声明public abstract的方法与Object中的public方法一一对应。

Comparator接口源码:

package java.util;

import java.io.Serializable;

import java.util.function.Function;

import java.util.function.ToIntFunction;

import java.util.function.ToLongFunction;

import java.util.function.ToDoubleFunction;

import java.util.Comparators;

@FunctionalInterface

public interface Comparator<T> {

int compare(T o1, T o2);

boolean equals(Object obj);

default Comparator<T> reversed() {

return Collections.reverseOrder(this);

}

default Comparator<T> thenComparing(Comparator<? super T> other) {

Objects.requireNonNull(other);

return (Comparator<T> & Serializable) (c1, c2) -> {

int res = compare(c1, c2);

return (res != 0) ? res : other.compare(c1, c2);

};

}

default <U> Comparator<T> thenComparing(

Function<? super T, ? extends U> keyExtractor,

Comparator<? super U> keyComparator)

{

return thenComparing(comparing(keyExtractor, keyComparator));

}

default <U extends Comparable<? super U>> Comparator<T> thenComparing(

Function<? super T, ? extends U> keyExtractor)

{

return thenComparing(comparing(keyExtractor));

}

default Comparator<T> thenComparingInt(ToIntFunction<? super T> keyExtractor) {

return thenComparing(comparingInt(keyExtractor));

}

default Comparator<T> thenComparingLong(ToLongFunction<? super T> keyExtractor) {

return thenComparing(comparingLong(keyExtractor));

}

default Comparator<T> thenComparingDouble(ToDoubleFunction<? super T> keyExtractor) {

return thenComparing(comparingDouble(keyExtractor));

}

public static <T extends Comparable<? super T>> Comparator<T> reverseOrder() {

return Collections.reverseOrder();

}

@SuppressWarnings("unchecked")

public static <T extends Comparable<? super T>> Comparator<T> naturalOrder() {

return (Comparator<T>) Comparators.NaturalOrderComparator.INSTANCE;

}

public static <T> Comparator<T> nullsFirst(Comparator<? super T> comparator) {

return new Comparators.NullComparator<>(true, comparator);

}

public static <T> Comparator<T> nullsLast(Comparator<? super T> comparator) {

return new Comparators.NullComparator<>(false, comparator);

}

public static <T, U> Comparator<T> comparing(

Function<? super T, ? extends U> keyExtractor,

Comparator<? super U> keyComparator)

{

Objects.requireNonNull(keyExtractor);

Objects.requireNonNull(keyComparator);

return (Comparator<T> & Serializable)

(c1, c2) -> keyComparator.compare(keyExtractor.apply(c1),

keyExtractor.apply(c2));

}

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));

}

public static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor) {

Objects.requireNonNull(keyExtractor);

return (Comparator<T> & Serializable)

(c1, c2) -> Integer.compare(keyExtractor.applyAsInt(c1), keyExtractor.applyAsInt(c2));

}

public static <T> Comparator<T> comparingLong(ToLongFunction<? super T> keyExtractor) {

Objects.requireNonNull(keyExtractor);

return (Comparator<T> & Serializable)

(c1, c2) -> Long.compare(keyExtractor.applyAsLong(c1), keyExtractor.applyAsLong(c2));

}

public static<T> Comparator<T> comparingDouble(ToDoubleFunction<? super T> keyExtractor) {

Objects.requireNonNull(keyExtractor);

return (Comparator<T> & Serializable)

(c1, c2) -> Double.compare(keyExtractor.applyAsDouble(c1), keyExtractor.applyAsDouble(c2));

}

}

comparator接口实现时,只需要实现 int compare(T o1, T o2)方法?的更多相关文章

  1. java实现Comparable接口和Comparator接口,并重写compareTo方法和compare方法

    原文地址https://segmentfault.com/a/1190000005738975 实体类:java.lang.Comparable(接口) + comareTo(重写方法),业务排序类 ...

  2. 用java8重写Arrays.sort(oldWay, new Comparator<String>(){@Override public int compare(String s1, String s2)});

    参考https://www.liaoxuefeng.com/article/001411306573093ce6ebcdd67624db98acedb2a905c8ea4000/ Java 8终于引进 ...

  3. mybatis返回list很智能很简答的,只需要配置resultmap进行类型转换,你dao方法直接写返回值list<对应的object>就行了啊

    mybatis返回list很智能很简答的,只需要配置resultmap进行类型转换,你dao方法直接写返回值list<对应的object>就行了啊 dao方法 public List< ...

  4. MyBatis-xml配置SQL文件中,传入List数组、基本类型String、int……、与自定义类型的方法

    //基本类型 @Override public String queryItemNumber(String packId) throws Exception { // TODO Auto-genera ...

  5. UITableView设置单元格选中后只显示一个打勾的三种简单方法(仅供参考)

    1.第一种方法:先定位到最后一行,若选中最后一行直接退出,否则用递归改变上次选中的状态,重新设置本次选中的状态. - (UITableViewCell*)tableView:(UITableView* ...

  6. sqlserver中将varchar类型转换为int型再进行排序的方法

    sql中把varchar类型转换为int型然后进行排序,如果我们数据库的ID设置为varchar型的 在查询的时候order by id的话 如果我们数据库的ID设置为varchar型的 在查询的时候 ...

  7. 从INT 到STRING的几种方法

    1.   int sprintf( char *buffer, const char *format [, argument] ... );      <stdio.h>例如: int s ...

  8. INT 21H 指令说明及使用方法

    很多初学汇编语言的同学可能会对INT 21H这条指令感到困惑,不知道是什么意思,下面就以一段简单的程序为大家讲解: 例如:需要键盘输入,并且回显. AH的值需要查表取得,表在下面 指令:      M ...

  9. iOS开发 - &quot;Cast from pointer to smaller type &#39;int&#39; loses information” 解决的方法

    今天要写一个联系人搜索算法. 百度了下, 在code4App中找到相关代码. 可是自己跑了下, 发现报错. 错误内容例如以下: "Cast from pointer to smaller t ...

随机推荐

  1. JavaEE就业学习路线(给初学者以及自学者一个学习方向)

    大家按这个路线学完后基本可以找工作了 第一节java入门 1-Java 背景介绍 2-Java 入门程序的编写 3-环境配置 4-基本概念介绍 5-类型转换 6-开发工具使用 第二节java基础 1- ...

  2. python接口自动化测试二十七:密码MD5加密 ''' MD5加密 ''' # 由于MD5模块在python3中被移除 # 在python3中使用hashlib模块进行md5操作 import hashlib # 待加密信息 str = 'asdas89799,.//plrmf' # 创建md5对象 hl = hashlib.md5() # Tips # 此处必须声明encode # 若写法为

    python接口自动化测试二十七:密码MD5加密   ''' MD5加密 '''# 由于MD5模块在python3中被移除# 在python3中使用hashlib模块进行md5操作import has ...

  3. django 中namespace的问题

    在早期的django版本中 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^polls/', include('polls.urls' ...

  4. C++基础之关联容器

    关联容器 关联容器和顺序容器的本质区别:关联容器是通过键存取和读取元素.顺序容器通过元素在容器中的位置顺序存储和访问元素.因此,关联容器不提供front.push_front.pop_front.ba ...

  5. 从 HTTP/1 到 HTTP/2,以及即将到来的 HTTP/3

    如今的生活中已经离不开互联网,智能家居.在线支付.网上购物都需要互联网的支持.互联网切切实实地给生活带来了诸多便利.有了互联网,我们可以呆在空调房里,一边刷着微博,一边等透心凉的西瓜送到手上,安安静静 ...

  6. 括号匹配(c语言实现)

    ⭐ 我的网站: www.mengyingjie.com ⭐ 1要求 编写程序检查该字符串的括号是否成对出现,而且不能交叉出现. 输入: 一个字符串,里边可能包含"()"." ...

  7. Dungeon Master POJ-2251 三维BFS

    题目链接:http://poj.org/problem?id=2251 题目大意 你被困在了一个三维的迷宫,找出能通往出口的最短时间.如果走不到出口,输出被困. 思路 由于要找最短路径,其实就是BFS ...

  8. gym102201E_Eat Economically

    题意 给\(2n\)个物品,分别有\(a,b\)属性,对于\(i=1...n\),选择\(i\)个\(a\)属性和\(i\)个\(b\)属性,且每个物品只能作为一种属性的贡献,求最小的值. 分析 看了 ...

  9. Maven 梳理-手动创建Maven项目(非web),使用Maven编译、测试、打包、安装、引用

    创建空目录 F:\jtDevelop\maventest\myapp 创建pom.xml文件 <project xmlns="http://maven.apache.org/POM/4 ...

  10. 12-z-index

    z-index 这个东西非常简单,它有四大特性,每个特性你记住了,页面布局就不会出现找不到盒子的情况. z-index 值表示谁压着谁,数值大的压盖住数值小的, 只有定位了的元素,才能有z-index ...