[轉(zhuǎn)載]java8 stream多字段排序

很多情況下sql不好解決的多表查詢,臨時表分組,排序,盡量用java8新特性stream進(jìn)行處理

使用java8新特性,下面先來點基礎(chǔ)的

List<類> list; 代表某集合
 
//返回 對象集合以類屬性一升序排序
 
list.stream().sorted(Comparator.comparing(類::屬性一));
 
//返回 對象集合以類屬性一降序排序 注意兩種寫法
 
list.stream().sorted(Comparator.comparing(類::屬性一).reversed());//先以屬性一升序,結(jié)果進(jìn)行屬性一降序
 
list.stream().sorted(Comparator.comparing(類::屬性一,Comparator.reverseOrder()));//以屬性一降序
 
//返回 對象集合以類屬性一升序 屬性二升序
 
list.stream().sorted(Comparator.comparing(類::屬性一).thenComparing(類::屬性二));
 
//返回 對象集合以類屬性一降序 屬性二升序 注意兩種寫法
 
list.stream().sorted(Comparator.comparing(類::屬性一).reversed().thenComparing(類::屬性二));//先以屬性一升序,升序結(jié)果進(jìn)行屬性一降序,再進(jìn)行屬性二升序
 
list.stream().sorted(Comparator.comparing(類::屬性一,Comparator.reverseOrder()).thenComparing(類::屬性二));//先以屬性一降序,再進(jìn)行屬性二升序
 
//返回 對象集合以類屬性一降序 屬性二降序 注意兩種寫法
 
list.stream().sorted(Comparator.comparing(類::屬性一).reversed().thenComparing(類::屬性二,Comparator.reverseOrder()));//先以屬性一升序,升序結(jié)果進(jìn)行屬性一降序,再進(jìn)行屬性二降序
 
list.stream().sorted(Comparator.comparing(類::屬性一,Comparator.reverseOrder()).thenComparing(類::屬性二,Comparator.reverseOrder()));//先以屬性一降序,再進(jìn)行屬性二降序
 
//返回 對象集合以類屬性一升序 屬性二降序 注意兩種寫法
 
list.stream().sorted(Comparator.comparing(類::屬性一).reversed().thenComparing(類::屬性二).reversed());//先以屬性一升序,升序結(jié)果進(jìn)行屬性一降序,再進(jìn)行屬性二升序,結(jié)果進(jìn)行屬性一降序?qū)傩远敌? 
list.stream().sorted(Comparator.comparing(類::屬性一).thenComparing(類::屬性二,Comparator.reverseOrder()));//先以屬性一升序,再進(jìn)行屬性二降序<br><br><br>

通過以上例子我們可以發(fā)現(xiàn)

  1. Comparator.comparing(類::屬性一).reversed();

  2. Comparator.comparing(類::屬性一,Comparator.reverseOrder());

兩種排序是完全不一樣的,一定要區(qū)分開來 1 是得到排序結(jié)果后再排序,2是直接進(jìn)行排序,很多人會混淆導(dǎo)致理解出錯,2更好理解,建議使用2

實際例子:

現(xiàn)有一個類test 有兩個屬性:state 狀態(tài) time 時間,需要狀態(tài)順序且時間倒序

class test {
    //狀態(tài)
    private int state;
    //時間
    private Date time;
 
    public test(int state, Date time) {
        this.state = state;
        this.time = time;
    }
 
    public int getState() {
        return state;
    }
 
    public void setState(int state) {
        this.state = state;
    }
 
    public Date getTime() {
        return time;
    }
 
    public void setTime(Date time) {
        this.time = time;
    }
 
    @Override
    public String toString() {
        return "test{" +
                "state=" + state +
                ", time=" + DateUtils.formatDateYMD(time) +
                '}';
    }
}
class testRun {
    public static void main(String[] args) {
        List<test> testList = new ArrayList<>();
        Date d = DateUtils.now();
        for (int i = 1; i <= 3; i++) {
            test t = new test(i, DateUtils.addDays(d, i));
            testList.add(t);
        }
        for (int i = 1; i <= 3; i++) {
            test t = new test(i, DateUtils.addMonths(d, i));
            testList.add(t);
        }
 
        testList.forEach(o -> {
            System.out.println(o.toString());
        });
        List<test> sort = testList.stream().sorted(Comparator.comparing(test::getState).thenComparing(test::getTime,Comparator.reverseOrder())).collect(toList());
        System.out.println("------------------------------------");
        sort.forEach(o -> {
            System.out.println(o.toString());
        });
 
 
    }
}
  運行結(jié)果:

排序前:
test{state=1, time=2019-07-24}
test{state=2, time=2019-07-25}
test{state=3, time=2019-07-26}
test{state=1, time=2019-08-23}
test{state=2, time=2019-09-23}
test{state=3, time=2019-10-23}


排序后:
test{state=1, time=2019-08-23}
test{state=1, time=2019-07-24}
test{state=2, time=2019-09-23}
test{state=2, time=2019-07-25}
test{state=3, time=2019-10-23}
test{state=3, time=2019-07-26}

Process finished with exit code 0


原文鏈接:https://www.cnblogs.com/kuanglongblogs/p/11230250.html
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末慌闭,一起剝皮案震驚了整個濱河市材彪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌骑科,老刑警劉巖无拗,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敛助,死亡現(xiàn)場離奇詭異隘膘,居然都是意外死亡刀森,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門伴奥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來写烤,“玉大人,你說我怎么就攤上這事拾徙。” “怎么了感局?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵尼啡,是天一觀的道長。 經(jīng)常有香客問我询微,道長崖瞭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任撑毛,我火速辦了婚禮书聚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己雌续,他們只是感情好斩个,可當(dāng)我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驯杜,像睡著了一般受啥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸽心,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天滚局,我揣著相機(jī)與錄音,去河邊找鬼顽频。 笑死藤肢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的糯景。 我是一名探鬼主播嘁圈,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼莺奸!你這毒婦竟也來了丑孩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤灭贷,失蹤者是張志新(化名)和其女友劉穎温学,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體甚疟,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡仗岖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了览妖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轧拄。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖讽膏,靈堂內(nèi)的尸體忽然破棺而出檩电,到底是詐尸還是另有隱情,我是刑警寧澤府树,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布俐末,位于F島的核電站,受9級特大地震影響奄侠,放射性物質(zhì)發(fā)生泄漏卓箫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一垄潮、第九天 我趴在偏房一處隱蔽的房頂上張望烹卒。 院中可真熱鬧闷盔,春花似錦、人聲如沸旅急。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坠非。三九已至敏沉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炎码,已是汗流浹背盟迟。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留潦闲,地道東北人攒菠。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像歉闰,于是被迫代替她去往敵國和親辖众。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容