版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/lyh147406/article/details/80651379
stream流的一些概念和理解:
stream流是Java8新出的概念,說白了,其實就是對集合的一種更高級的拓展,
在很多業務邏輯場景中, 我們需要對集合進行很多的操作,例如遍歷,篩選,比較,排序等,這些需要我們寫很多的代碼, 有些時候我們還需要連接數據庫,通過sql 對數據進行處理和篩選。 stream流就會好很多,它以聲明式的操作集合,現在我們只需要告訴流需要對集合進行什麼操作,那麼它就會自動在內部進行操作,不會顯示的表現出來,而且也無需我們手動寫代碼了。用的好的話,stream流也能讓我們少寫很多sql語句。
stream流的一些特點:
1一次遍歷
我們可以把流想象成一條流水線,流水線的源頭是我們的數據源(一個集合),數據源中的元素依次被輸送到流水線上,我們可以在流水線上對元素進行各種操作。一旦元素走到了流水線的另一頭,我們無法再對這個流進行操作。當然,我們可以從數據源那裏再獲得一個新的流重新遍歷一遍。
2採用內部迭代方式
若要對集合進行處理,則需我們手寫處理代碼,這就叫做外部迭代。而要對流進行處理,我們只需告訴流我們需要什麼結果,處理過程由流自行完成,這就稱爲內部迭代。
這裏要注意的是,不管你做什麼操作,源數據的內容是不會被改變的,改變的結果只呈現在結果集中。
stream流的一些具體方法:
如何獲取流:
集合
這種數據源較爲常用,通過stream()方法即可獲取流對象:
List<Person> list = new ArrayList<Person>();
Stream<Person> stream = list.stream();
數組
通過Arrays類提供的靜態函數stream()獲取數組的流對象:
String[] names = {"chaimm","peter","john"};
Stream<String> stream = Arrays.stream(names);
值
直接將幾個值變成流對象:
Stream<String> stream = Stream.of("chaimm","peter","john");
一、篩選和切片(對流的數據進行過濾和選擇自己想要的數據)
- 用謂詞篩選 ==filter(T -> T.getXX())==
- 判斷相同 去重 ==distinct()==
- 截斷流 截取 ==limit(n)==
- 跳過元素 ==skip(n)==
- 排序 ==sorted(Comparator.comparing(T::getXX))==
- 遍歷 ==forEach(XXX)==
二、映射
- 對流中每一個元素應用函數 ==map()====> 一般用於提取流中的內容 map(T :: getXX)
- 流的扁平化 ==flatMap()== 多個流合併成一個流==> 將一個流中每個值都轉換成另外一個流,然後再將轉換的所有的流鏈接成一個流
三、查找與匹配
- 查找至少一個匹配 ==anyMatch()==
- 查找是全匹配 ==allMatch()==對應的無匹配是 ==noneMatch()==
- 查找任意元素 ==findAny()==
- 查找第一個元素 ==findFirst()==
- 查找最小/最大的
四、歸約(就是將流中的所有元素經過指定運算,摺疊成一個元素輸出)
- 求和 ==reduce(初始值,Integer :: sum)==
- 求最大最小 ==reduce(初始值,Integer :: sum)==
Stream流的實踐:
按照我們習以爲常的學生來舉例子吧:創建實體類,這裏就寫了, 大家明白
然後我們獲取一個包含了 所有學生姓名,年齡,成績,的一個數組,命名爲 studentListAll
現在有個班級,挑選出學生年齡在18歲以下的學生,並按照學習成績好壞將他們排序,然後然他們站成一排領獎。
如果按照以前的思路,我們要這麼實現:
通過迭代器篩選出年齡小於18歲的學生
List<Student> studentList= new ArrayList<Student>();
for (Student stu :studentListAll) {
if (stu.getAge() < 18) {
studentList.add(s);
}
}
按照匿名類將學生的成績從大到小排序
Collections.sort(studentList, new Comparator<Stone>() {
public int compare(Student stu1, Student stu2) {
returnInteger.compare(stu1.getGrade(), stu2.getGrade());
}
});
將排序好的學生站好隊伍
List<String> finalStudentList = new ArrayList<Student>();
for (Student stu : studentList) {
finalStudentList.add(stu.getName());
}
}
Java8(Stream)實現
那麼接下來就是根據stream流來實現。
List<String> finalStudentList = studentAllList.stream() //將源數據轉化成stream流
.filter( stu ->stu.getAge()<18) // 將小於18歲的學生提取出來
.sorted(comparing(Student :: getGrade)) //對學生的成績進行排序
.map(Student :: getName) // 取出符合要求的學生的名字
.collect(toList()); //將名字保存到List中。
下面這個博客有更詳細的實例