久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

Spring中如何使用Comparator接口

瀏覽:93日期:2023-07-08 08:00:38

我們先來回顧下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方法:

@Overridepublic 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@Nullableprotected 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接口的詳細內容,更多關于Spring 使用Comparator接口的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
主站蜘蛛池模板: 欧美日韩国产免费一区二区三区 | 国产精品成人久久久久 | 国产精品美女久久久久久久久久久 | 日韩一区二区不卡 | 精品一区二区三区蜜桃 | 91精品国产欧美一区二区成人 | 国产精品久久天天躁 | 亚洲国产精品人人爽夜夜爽 | 亚洲性爰 | 四季久久免费一区二区三区四区 | 精品99在线 | 久久久久免费精品视频 | 91九色视频国产 | 欧美日韩成人在线 | 色婷婷国产精品免费网站 | 成人片网址 | 日日爱视频 | 中文字幕日韩在线 | 久久久国产精品入口麻豆 | 成人亚洲欧美 | 国产欧美一区二区 | 日本高清中文字幕 | 精品久久久久久久久久久 | 亚洲精品乱码久久久久久蜜桃 | 久久精品亚洲 | 日韩欧美视频 | 91午夜在线| 成人国产 | 香蕉视频黄色 | 久久精品1 | 久久青| 视频一区 国产精品 | 美女二区| 亚洲精品成人 | 欧美一级高清在线 | 91精品国产综合久久久久久漫画 | 精品国产一区二区三区av片 | 一色桃子av一区二区免费 | 久久九九国产 | 成年无码av片在线 | 亚洲性视屏|