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