色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Spring中如何使用Comparator接口

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

我們先來(lái)回顧下Comparator接口在我們?nèi)粘i_(kāi)發(fā)中的作用,Comparator比較器接口可以將自身傳遞給排序方法(比如Collections.sort或Arrays.sort),以便對(duì)排序順序進(jìn)行精確控制。比如:

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

輸出

[3, 2, 1]

Comparator可以用來(lái)控制某些數(shù)據(jù)結(jié)構(gòu)(如sored sets 或sorted maps)的順序,或者為沒(méi)有自然順序的對(duì)象集合提供順序,比如:

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是策略模式的一個(gè)經(jīng)典體現(xiàn),在Spring中它為實(shí)現(xiàn)了Ordered接口的類(lèi)寫(xiě)了一個(gè)比較器名叫OrderComparator,我們來(lái)看看它的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) { //判斷是否實(shí)現(xiàn)了PriorityOrdered接口 //o1為原先的后一個(gè)元素 //o2為原先的前一個(gè)元素 boolean p1 = (o1 instanceof PriorityOrdered); boolean p2 = (o2 instanceof PriorityOrdered); //p1實(shí)現(xiàn)了PriorityOrdered,但是p2沒(méi)實(shí)現(xiàn)PriorityOrdered,則p1優(yōu)先級(jí)更高 if (p1 && !p2) { ////小于0 表示逆序 o1排前 return -1; } else if (p2 && !p1) { //p2實(shí)現(xiàn)了PriorityOrdered,但是p1沒(méi)實(shí)現(xiàn)PriorityOrdered,則p2優(yōu)先級(jí)更高 //大于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代表最低優(yōu)先級(jí)return Ordered.LOWEST_PRECEDENCE; } @Nullable protected Integer findOrder(Object obj) {return (obj instanceof Ordered ? ((Ordered) obj).getOrder() : null); }

OrderComparator主要是通過(guò)實(shí)現(xiàn)Order接口方法getOrder返回的值來(lái)比較的,而通過(guò)注解Order比較的話(huà)是采用繼承OrderComparator類(lèi)的AnnotationAwareOrderComparator類(lèi)來(lái)重載getOrder方法來(lái)實(shí)現(xiàn):

@Override@Nullableprotected Integer findOrder(Object obj) { // Check for regular Ordered interface //檢查常規(guī)的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代表在當(dāng)前運(yùn)行的java虛擬機(jī)中一個(gè)可以被注解的元素,這個(gè)接口允許通過(guò)反射讀取元素上面的注解,這與我們之前的理解是一致的 //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等注解實(shí)際上都采用了實(shí)現(xiàn)Order注解的方法來(lái)進(jìn)行排序。這里我就截個(gè)圖看下了:

Spring中如何使用Comparator接口

Conditional注解中的OnClassCondition類(lèi)就標(biāo)了@Order注解

Spring中如何使用Comparator接口

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

Spring中如何使用Comparator接口

用中文簡(jiǎn)單來(lái)說(shuō)就是在 JDK7 版本以上默認(rèn)使用Timsort排序方法來(lái)實(shí)現(xiàn),Comparator 比較器要滿(mǎn)足自反性,傳遞性,反對(duì)稱(chēng)性,不然 Arrays.sort,Collections.sort有可能會(huì)報(bào) IllegalArgumentException 異常。

以上就是Spring中如何使用Comparator接口的詳細(xì)內(nèi)容,更多關(guān)于Spring 使用Comparator接口的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 日本黄页网站在线观看 | 免费99热在线观看 | 91精品国产爱久久久久 | 免费刺激视频 | 午夜主播福利视频在线观看 | 久久精品视频免费在线观看 | 亚洲无吗视频 | 成年人午夜免费视频 | 国产精品亚洲一区二区三区久久 | 99免费在线播放99久久免费 | 欧美日韩高清不卡一区二区三区 | 午夜在线亚洲 | 三级网站免费 | 美女扒开腿让男人桶尿口 | 亚洲视频在线观看视频 | 国产亚洲一区二区在线观看 | 中文字幕一二三四区2021 | 中文字幕日韩精品中文区 | 午夜在线亚洲男人午在线 | 国产一区二区日韩欧美在线 | 天堂视频在线免费观看 | 91日本在线视频 | 国产精品成人久久久 | 怡红院成人网 | 日本一区二区三区四区无限 | 欧美国产日韩久久久 | 日本欧美亚洲 | 看久久| 国产精品成人一区二区 | 欧美精品一二三区 | 精品日本亚洲一区二区三区 | 99久久精品国产自免费 | 在线播放成人毛片免费视 | 97se狠狠狠狠狠亚洲综合网 | 免费一级肉体全黄毛片高清 | 538在线视频二三区视视频 | 欧美综合视频在线 | 国产成人久久精品麻豆二区 | 99精品久久久久久 | 精品一区二区三区四区在线 | 中文字幕 日韩在线 |