Java中的排序问题(Java8新特性 stream流、stream多字段排序)
1、概要
Java 8 API添加了一個新的抽象成為流Stream,它以一種聲明的方式處理數(shù)據(jù),最后由最終操作得到前面處理的結(jié)果。
Stream專注于集合對象的操作,將要處理的元素集合看作一種流, 流在管道中傳輸, 并且可以在管道的節(jié)點(diǎn)上進(jìn)行處理, 比如篩選, 排序,聚合等。
Stream在處理大批量數(shù)據(jù)操作中更加高效。
Stream + Lambda 表達(dá)式可以極大提高Java程序員的生產(chǎn)力,讓程序員寫出高效率、干凈、簡潔的代碼。
stream的三大特性:1、不存儲數(shù)據(jù);2、不改變源數(shù)據(jù);3、延時執(zhí)行。
stream優(yōu)點(diǎn):1、簡化代碼;2、使用并行流可以利用多核特性,提升效率。
stream上的所有操作分為兩類:中間操作和結(jié)束操作,中間操作只是一種標(biāo)記,只有結(jié)束操作才會觸發(fā)實(shí)際計算。
2、什么是流
Stream不是集合元素,它不是數(shù)據(jù)結(jié)構(gòu)并不保存數(shù)據(jù),它是有關(guān)算法和計算的,它更像一個高級版本的Iterator。原始版本的Iterator,用戶只能顯式地一個一個遍歷元素并對其執(zhí)行某些操作;高級版本的Stream,用戶只要給出需要對其包含的元素執(zhí)行什么操作,比如,“過濾掉長度大于 10 的字符串”、“獲取每個字符串的首字母”等,Stream會隱式地在內(nèi)部進(jìn)行遍歷,做出相應(yīng)的數(shù)據(jù)轉(zhuǎn)換。Stream就如同一個迭代器(Iterator),單向,不可往復(fù),數(shù)據(jù)只能遍歷一次,遍歷過一次后即用盡了,就好比流水從面前流過,一去不復(fù)返。
而和迭代器又不同的是,Stream可以并行化操作,迭代器只能命令式地、串行化操作。顧名思義,當(dāng)使用串行方式去遍歷時,每個item讀完后再讀下一個item。而使用并行去遍歷時,數(shù)據(jù)會被分成多個段,其中每個段在不同的線程中處理,然后將結(jié)果一起輸出。Stream的并行操作依賴于Java7中引入的Fork/Join框架(JSR166y)來拆分任務(wù)和加速處理過程。
Stream 的另外一大特點(diǎn)是,數(shù)據(jù)源本身可以是無限的。
工作中,經(jīng)常會需要對集合內(nèi)的元素進(jìn)行排序。利用Java8可以很方便的對List內(nèi)的元素進(jìn)行排序操作;而在很多情況下sql不好
解決的多表查詢,臨時表分組,排序,盡量用java8新特性stream進(jìn)行處理。
List 倒序排列
List<Double> salesData = new ArrayList<>();
Collections.reverse(salesData);
java8 stream多字段排序
List<類> rankList = new ArrayList<>(); 代表某個集合
//返回 對象集合以類屬性一升序排序
rankList.stream().sorted(Comparator.comparing(類::屬性一));
//返回 對象集合以類屬性一降序排序 注意兩種寫法
rankList.stream().sorted(Comparator.comparing(類::屬性一).reversed()); //先以屬性一升序,然后對結(jié)果集進(jìn)行屬性一降序
rankList.stream().sorted(Comparator.comparing(類::屬性一, Comparator.reverseOrder())); //以屬性一降序
//返回 對象集合以類屬性一升序 屬性二升序
rankList.stream().sorted(Comparator.comparing(類::屬性一).thenComparing(類::屬性二));
//返回 對象集合以類屬性一降序 屬性二升序 注意兩種寫法
rankList.stream().sorted(Comparator.comparing(類::屬性一).reversed().thenComparing(類::屬性二));//先以屬性一升序,升序結(jié)果進(jìn)行屬性一降序,再進(jìn)行屬性二升序
rankList.stream().sorted(Comparator.comparing(類::屬性一,Comparator.reverseOrder()).thenComparing(類::屬性二));//先以屬性一降序,再進(jìn)行屬性二升序
//返回 對象集合以類屬性一降序 屬性二降序 注意兩種寫法
rankList.stream().sorted(Comparator.comparing(類::屬性一).reversed().thenComparing(類::屬性二,Comparator.reverseOrder()));//先以屬性一升序,升序結(jié)果進(jìn)行屬性一降序,再進(jìn)行屬性二降序
rankList.stream().sorted(Comparator.comparing(類::屬性一,Comparator.reverseOrder()).thenComparing(類::屬性二,Comparator.reverseOrder()));//先以屬性一降序,再進(jìn)行屬性二降序
//返回 對象集合以類屬性一升序 屬性二降序 注意兩種寫法
rankList.stream().sorted(Comparator.comparing(類::屬性一).reversed().thenComparing(類::屬性二).reversed());//先以屬性一升序,升序結(jié)果進(jìn)行屬性一降序,再進(jìn)行屬性二升序,結(jié)果進(jìn)行屬性一降序?qū)傩远敌?
rankList.stream().sorted(Comparator.comparing(類::屬性一).thenComparing(類::屬性二,Comparator.reverseOrder()));//先以屬性一升序,再進(jìn)行屬性二降序
注意兩種寫法
1、 Comparator.comparing(類::屬性一).reversed();
2、 Comparator.comparing(類::屬性一,Comparator.reverseOrder());
兩種排序是完全不一樣的,一定要區(qū)分開來:方式1是得到排序結(jié)果后再排序,方式2是直接進(jìn)行排序!!!方式2更好理解。
其他同類知識點(diǎn):
1、Java8中的Stream()與ParallelStream()的區(qū)別;
2、Java集合Stream類filter的使用
總結(jié)
以上是生活随笔為你收集整理的Java中的排序问题(Java8新特性 stream流、stream多字段排序)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅谈数据结构-插入排序(直接插入、希尔排
- 下一篇: word如何快速定位(快速定位到需要的位