首頁  >  文章  >  Java  >  Java 8中使用流和自訂比較器進行排序的方法是什麼?

Java 8中使用流和自訂比較器進行排序的方法是什麼?

王林
王林轉載
2023-05-07 21:46:061566瀏覽

java8 stream排序及自訂比較器

使用java 8 stream 排序LIst 以及自訂物件比較器

主要比較的是時間,但時間為最近時間,java中compareto方法比較的ACSII碼所以2020和2021肯定是0在前面,但是我們需要的是最近的日期在前面,所以我們對返回的結果做出來取反,正常情況對象1的edittime和對象2的time比較的是如果物件1的time小於物件2的time就會回傳1 ,所有我們會發現2020在前面,我們只需要取反,因為compareto 的結果只有三種一種是1 升序,-1降序, 0是相等的意思( String類別實作了Comparable介面。

CompareTo方法相等回傳0,升序回傳1,降序回傳-1),這裡可以理解為什麼取反嗎?

因為取反之後2021-09-06的就可以在前面啦。就可以按照最近時間的順序進行排序啦。

如果有的java 8 stream 不懂的可以去看看哦

List<Map<String,Object>> resultList = null;

        Map<String,Object> ss1 = new HashMap<>();
        ss1.put("dictcode","2");
        ss1.put("DictValue","霓虹灯广告1");
        ss1.put("EditTime","2021-09-16 17:47:30");
        Map<String,Object> ss2 = new HashMap<>();
        ss2.put("dictcode","1");
        ss2.put("DictValue","霓虹灯广告2");
        ss2.put("EditTime","2020-04-16 17:47:30");
        Map<String,Object> ss3 = new HashMap<>();
        ss3.put("dictcode","21");
        ss3.put("DictValue","霓虹灯广告3");
        ss3.put("EditTime","2020-09-13 17:47:30");
        Map<String,Object> ss4 = new HashMap<>();
        ss4.put("dictcode","3");
        ss4.put("DictValue","霓虹灯广告4");
        ss4.put("EditTime","2020-09-16 17:47:30");
        Map<String,Object> ss5 = new HashMap<>();
        ss5.put("dictcode","4");
        ss5.put("DictValue","霓虹灯广告5");
        ss5.put("EditTime","2020-09-16 17:47:30");

        List<Map<String, Object>> maps = Arrays.asList(ss1, ss2, ss3, ss5, ss4);

        //默认按edittime排序,如果时间相同或者为空,则按照code排序
        maps.stream().sorted((o1, o2) -> {
            if (StringUtils.isEmpty(o1.get("EditTime").toString()) || StringUtils.isEmpty(o2.get("EditTime").toString())) {
                return o1.get("dictcode").toString().compareTo(o2.get("dictcode").toString());
            } else if (o1.get("EditTime").equals(o2.get("EditTime"))) {
                return o1.get("dictcode").toString().compareTo(o2.get("dictcode").toString());
            } else
                if (o1.get("EditTime").toString().compareTo(o2.get("EditTime").toString()) > 0)
                    return -1;
                 else return 1;
            /*if (StringUtils.isEmpty(o1.get("EditTime").toString())||StringUtils.isEmpty(o2.get("EditTime").toString())
            || o1.get("EditTime").equals(o2.get("EditTime"))) {
                return o1.get("dictcode").toString().compareTo(o2.get("dictcode").toString());
            }
            else {
               if (o1.get("EditTime").toString().compareTo(o2.get("EditTime").toString()) >0)
                   return -1;
               return 1;
            }*/
        }).collect(Collectors.toList()).forEach(System.out::println);

java stream排序問題

我們在處理資料的時候經常會需要進行排序後再返回給前端調用,例如按照時間升序排序,前端展示資料就是按時間先後進行排序。

這裡可以運用stream的sorted()方法來進行自訂的排序

說下用法

這裡舉例資料是一個list集合,Listb698f00c7a5e368bd282ff25ef940af4list, Data實體類別中有許多屬性,其中有時間字段,month 月份,那我們用stream().sorted()方法排序時,因為元素是類別引用類型,需要自訂一個比較器Comparator,按month月份進行升序排序。

程式碼如下:

list.stream().sorted(Comparator.comparing(o->new Integer(o.getMonth()))).collect(Collectors.toList());

注意:

這裡比較器裡面參數用了Lambda 表達式,new Integer(o.getMonth()) ,這種封裝成Integer類型的是因為我們設計的Data實體類別中的month屬性是String類型,並非Integer,轉換成Integer是為了後續做月份遍歷判斷,如果屬性是Integer Month,則可以比較器中可以直接定義類別的方法引用

如下:

list.stream().sorted(Comparator.comparing(Data::getMonth).collect(Collectors.toList());

以上是Java 8中使用流和自訂比較器進行排序的方法是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除