91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring中怎么使用Comparator接口

發布時間:2021-06-22 13:06:29 來源:億速云 閱讀:181 作者:小新 欄目:開發技術

小編給大家分享一下Spring中怎么使用Comparator接口,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

我們先來回顧下Comparator接口在我們日常開發中的作用,Comparator比較器接口可以將自身傳遞給排序方法(比如Collections.sort或Arrays.sort),以便對排序順序進行精確控制。比如:

List<Integer> intList = Arrays.asList(2, 3, 1);
Collections.sort(intList, (o1, o2) -> {
   return o2-o1;
});

輸出

[3, 2, 1]

Comparator可以用來控制某些數據結構(如sored sets 或sorted maps)的順序,或者為沒有自然順序的對象集合提供順序,比如:

public class Emp {
   private int empNo;
   private String eName;
   //省略getter setter
   @Override
   public String toString()
   {
      return "empno:\t"+empno+"\tename:\t"+ename;
   }
}
Comparator<Emp> comparator = (o1, o2) -> {
            return o1.getEmpno()-o2.getEmpno();
};
empList.sort(comparator);

從以上使用方法可以看出Comparator是策略模式的一個經典體現,在Spring中它為實現了Ordered接口的類寫了一個比較器名叫OrderComparator,我們來看看它的compare方法:

@Override
public int compare(@Nullable Object o1, @Nullable Object o2) {
   return doCompare(o1, o2, null);
}
private int doCompare(@Nullable Object o1, @Nullable Object o2, @Nullable OrderSourceProvider sourceProvider) {
   //判斷是否實現了PriorityOrdered接口
    //o1為原先的后一個元素
    //o2為原先的前一個元素
   boolean p1 = (o1 instanceof PriorityOrdered);
   boolean p2 = (o2 instanceof PriorityOrdered);
  //p1實現了PriorityOrdered,但是p2沒實現PriorityOrdered,則p1優先級更高
   if (p1 && !p2) {
         ////小于0 表示逆序 o1排前
      return -1;
   }
   else if (p2 && !p1) {
     //p2實現了PriorityOrdered,但是p1沒實現PriorityOrdered,則p2優先級更高
            //大于0 表示正序 o2排前
      return 1;
   }
   int i1 = getOrder(o1, sourceProvider);
   int i2 = getOrder(o2, sourceProvider);
   return Integer.compare(i1, i2);
}
 
    protected int getOrder(@Nullable Object obj) {
        if (obj != null) {
            Integer order = findOrder(obj);
            if (order != null) {
                return order;
            }
        }
    //Integer.MAX_VALUE代表最低優先級
        return Ordered.LOWEST_PRECEDENCE;
    }
 
    @Nullable
    protected Integer findOrder(Object obj) {
        return (obj instanceof Ordered ? ((Ordered) obj).getOrder() : null);
    }

OrderComparator主要是通過實現Order接口方法getOrder返回的值來比較的,而通過注解Order比較的話是采用繼承OrderComparator類的AnnotationAwareOrderComparator類來重載getOrder方法來實現:

@Override
@Nullable
protected Integer findOrder(Object obj) {
   // Check for regular Ordered interface
   //檢查常規的Order接口
   Integer order = super.findOrder(obj);
   if (order != null) {
      return order;
   }
     //檢查@Order注解和@Priority注解
   // Check for @Order and @Priority on various kinds of elements
   if (obj instanceof Class) {
      return OrderUtils.getOrder((Class<?>) obj);
   }
   else if (obj instanceof Method) {
      Order ann = AnnotationUtils.findAnnotation((Method) obj, Order.class);
      if (ann != null) {
         return ann.value();
      }
   }
   else if (obj instanceof AnnotatedElement) {
      //AnnotatedElement代表在當前運行的java虛擬機中一個可以被注解的元素,這個接口允許通過反射讀取元素上面的注解,這與我們之                前的理解是一致的
      //https://www.yuque.com/cuihualong/javaseries/sh91es
      Order ann = AnnotationUtils.getAnnotation((AnnotatedElement) obj, Order.class);
      if (ann != null) {
         return ann.value();
      }
   }
   else {
      order = OrderUtils.getOrder(obj.getClass());
      if (order == null && obj instanceof DecoratingProxy) {
         order = OrderUtils.getOrder(((DecoratingProxy) obj).getDecoratedClass());
      }
   }
   return order;
}

這里順便提下在SpringBoot中ConditionalOnBean,ConditionalOnProperty,ConditionalOnClass等注解實際上都采用了實現Order注解的方法來進行排序。這里我就截個圖看下了:

Spring中怎么使用Comparator接口

Conditional注解中的OnClassCondition類就標了@Order注解

Spring中怎么使用Comparator接口

實現Comparator接口compare方法的時候主要是要注意以下幾點(翻譯自官方文檔):

Spring中怎么使用Comparator接口

用中文簡單來說就是在 JDK7 版本以上默認使用Timsort排序方法來實現,Comparator 比較器要滿足自反性,傳遞性,反對稱性,不然 Arrays.sort,Collections.sort有可能會報 IllegalArgumentException 異常。

以上是“Spring中怎么使用Comparator接口”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新余市| 蓬安县| 乌拉特后旗| 万全县| 固始县| 凤山县| 靖安县| 托里县| 尤溪县| 和静县| 富阳市| 庆阳市| 齐齐哈尔市| 娱乐| 新泰市| 盐亭县| 静乐县| 海安县| 龙川县| 凤翔县| 饶阳县| 北宁市| 商河县| 龙游县| 陵水| 南通市| 论坛| 丹寨县| 泰安市| 峨边| 广水市| 鞍山市| 敦煌市| 乐昌市| 体育| 北宁市| 水城县| 三河市| 大英县| 都兰县| 拜城县|