【小家Java】聊聊Java中的比较器(排序):Comparable和Comparator;Spring中的Comparators和AnnotationAwareOrderComparator(下)

简介: 【小家Java】聊聊Java中的比较器(排序):Comparable和Comparator;Spring中的Comparators和AnnotationAwareOrderComparator(下)

Spring中的ComparableComparator和Comparators


备注此处的Comparators指的是Spring包下的:org.springframework.util.comparator.Comparators,因为JDK自带的java.util.Comparators它是不提供给外部访问的。


ComparableComparator

// @since 1.2.2 比较器,用于将可比较器适配比较器接口。
public class ComparableComparator<T extends Comparable<T>> implements Comparator<T> {
  // 实例 单例    这样子的话就可以当作Comparator来使用了
  @SuppressWarnings("rawtypes")
  public static final ComparableComparator INSTANCE = new ComparableComparator();
  @Override
  public int compare(T o1, T o2) {
    return o1.compareTo(o2);
  }
}


这个适配类是Spring1.2.2就出来了,但是下面的工具:Comparators可是Spring5.0才提供


Comparators


它是Spring5.0后提供的一个工具类,里面主要是提供了一些静态方法,来提供外部比较器

// @since 5.0  注意使用它和直接使用Comparator的区别是,它要求你比较的对象都实现了Comparable的   否则都是不适用的
public abstract class Comparators {
  // 自然排序~~~~
  // Arrays.sort(people, Comparators.comparable()); 比如你这么用,是要求peple里面元素实现了Comparable接口的  否则报错
  @SuppressWarnings("unchecked")
  public static <T> Comparator<T> comparable() {
    return ComparableComparator.INSTANCE;
  }
  // null放在最后
  @SuppressWarnings("unchecked")
  public static <T> Comparator<T> nullsLow() {
    return NullSafeComparator.NULLS_LOW;
  }
  /// null放最后  并且我们还可以提供一个自定义的比较器
  public static <T> Comparator<T> nullsLow(Comparator<T> comparator) {
    return new NullSafeComparator<>(comparator, true);
  }
  @SuppressWarnings("unchecked")
  public static <T> Comparator<T> nullsHigh() {
    return NullSafeComparator.NULLS_HIGH;
  }
  public static <T> Comparator<T> nullsHigh(Comparator<T> comparator) {
    return new NullSafeComparator<>(comparator, false);
  }
}


OrderComparator


使用OrderComparator来比较2个对象的排序顺序。注意它用于Spring用来比较实现了Ordered接口的对象。

注意它@since 07.04.2003出现得非常早,所以这个类并不支持@Order注解的排序~~~


但是,PriorityOrdered接口它也是支持的,虽然它Spring2.5才出现。

另外,它是一个Comparator,所以它可以作为自定义比较器放在数组、集合里排序。形如;

public class OrderComparator implements Comparator<Object> {
  ...
  public static void sort(List<?> list) {
    if (list.size() > 1) {
      list.sort(INSTANCE);
    }
  }
  public static void sort(Object[] array) {
    if (array.length > 1) {
      Arrays.sort(array, INSTANCE);
    }
  }
  public static void sortIfNecessary(Object value) {
    if (value instanceof Object[]) {
      sort((Object[]) value);
    }
    else if (value instanceof List) {
      sort((List<?>) value);
    }
  }
}


AnnotationAwareOrderComparator


AnnotationAwareOrderComparator继承自OrderComparator

其可以同时处理对象实现Ordered接口或@Order注解。


显然它增强了排序能力,不仅支持Ordered接口,还支持到了@Order注解。


@Order注解@since 2.0,AnnotationAwareOrderComparator它@since 2.0.1,几乎同时出现的


它提供了两个静态方法,使用非常广泛,方便我们对数组、即可记性排序:


public class AnnotationAwareOrderComparator extends OrderComparator {
  /**
   * 用来检查实现Ordered接口、@Order和@Priority注解
   */
    protected Integer findOrder(Object obj) {
    // 检查常规的Ordered接口,通过子类重写的getOrder方法返回顺序值
        Integer order = super.findOrder(obj);
    if (order != null) {
      return order;
    }
    // 检查实现@Order和@Priority注解
    if (obj instanceof Class) {
            // 在类上检查@Order和@Priority注解,并找出顺序值
      return OrderUtils.getOrder((Class<?>) obj);
    } else if (obj instanceof Method) {
            // 在方法上检查@Order注解,并找出顺序值
      Order ann = AnnotationUtils.findAnnotation((Method) obj, Order.class);
      if (ann != null) {
        return ann.value();
      }
    } else if (obj instanceof AnnotatedElement) {
            // 在注解中找@Order注解,并找出顺序值
      Order ann = AnnotationUtils.getAnnotation((AnnotatedElement) obj, Order.class);
      if (ann != null) {
        return ann.value();
      }
    } else if (obj != null) {
      order = OrderUtils.getOrder(obj.getClass());
      if (order == null && obj instanceof DecoratingProxy) {
        order = OrderUtils.getOrder(((DecoratingProxy) obj).getDecoratedClass());
      }
    }
    return order;
  }
  // ==================================================================
  // 注意此处和上面的区别,它用的是自己的instance
  public static void sort(List<?> list) {
    if (list.size() > 1) {
      list.sort(INSTANCE);
    }
  }
   */
  public static void sort(Object[] array) {
    if (array.length > 1) {
      Arrays.sort(array, INSTANCE);
    }
  }
  public static void sortIfNecessary(Object value) {
    if (value instanceof Object[]) {
      sort((Object[]) value);
    }
    else if (value instanceof List) {
      sort((List<?>) value);
    }
  }
}


OrderUtils


最后介绍这个工具类,它是Spring4.1后提出的。它支持注解@Order和javax.annotation.Priority也是被支持的,因此它的getOrder()方法就是获取order值了。


需要注意的是:先找@Order,若没有再去找@Priority,都没标注就返回默认值

该工具类并不支持Ordered接口的方式~~~

总结


对象排序或许是平时我们开发中都忽略的一块小知识点,我本人而言,每次使用都需要自己单元测试一番,生怕顺序弄反了。因此对此部分内容作一个记录,希望成为永久的记忆~~~

相关文章
|
4天前
|
Java Nacos 开发者
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
|
4天前
|
Dubbo Java 应用服务中间件
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
|
10天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
11天前
|
负载均衡 Java 开发者
细解微服务架构实践:如何使用Spring Cloud进行Java微服务治理
【4月更文挑战第17天】Spring Cloud是Java微服务治理的首选框架,整合了Eureka(服务发现)、Ribbon(客户端负载均衡)、Hystrix(熔断器)、Zuul(API网关)和Config Server(配置中心)。通过Eureka实现服务注册与发现,Ribbon提供负载均衡,Hystrix实现熔断保护,Zuul作为API网关,Config Server集中管理配置。理解并运用Spring Cloud进行微服务治理是现代Java开发者的关键技能。
|
12天前
|
安全 Java 数据安全/隐私保护
使用Spring Security进行Java身份验证与授权
【4月更文挑战第16天】Spring Security是Java应用的安全框架,提供认证和授权解决方案。通过添加相关依赖到`pom.xml`,然后配置`SecurityConfig`,如设置用户认证信息和URL访问规则,可以实现应用的安全保护。认证流程包括请求拦截、身份验证、响应生成和访问控制。授权则涉及访问决策管理器,如基于角色的投票。Spring Security为开发者构建安全应用提供了全面且灵活的工具,涵盖OAuth2、CSRF保护等功能。
|
13天前
|
Java 大数据 云计算
Spring框架:Java后台开发的核心
【4月更文挑战第15天】Spring框架在Java后台开发中占据核心位置,因其控制反转(IoC)、面向切面编程(AOP)、事务管理等特性提升效率和质量。Spring提供数据访问集成、RESTful Web服务和WebSocket支持。优势包括高效开发、灵活扩展、强大生态圈和广泛应用。应用于企业级应用、微服务架构及云计算大数据场景。掌握Spring对Java开发者至关重要。
|
15天前
|
Java 应用服务中间件 Maven
使用IDEA搭建SpringMVC环境,Maven导入了依赖,但是运行报错 java.lang.ClassNotFoundException
使用IDEA搭建SpringMVC环境,Maven导入了依赖,但是运行报错 java.lang.ClassNotFoundException
14 1
|
24天前
|
存储 安全 Java
Spring Security应用讲解(Java案列演示)
Spring Security应用讲解(Java案列演示)
|
25天前
|
前端开发 安全 Java
使用Java Web框架:Spring MVC的全面指南
【4月更文挑战第3天】Spring MVC是Spring框架的一部分,用于构建高效、模块化的Web应用。它基于MVC模式,支持多种视图技术。核心概念包括DispatcherServlet(前端控制器)、HandlerMapping(请求映射)、Controller(处理请求)、ViewResolver(视图解析)和ModelAndView(模型和视图容器)。开发流程涉及配置DispatcherServlet、定义Controller、创建View、处理数据、绑定模型和异常处理。
使用Java Web框架:Spring MVC的全面指南
|
25天前
|
XML Java 程序员
作为Java程序员还不知道Spring中Bean创建过程和作用?
作为Java程序员还不知道Spring中Bean创建过程和作用?
15 0