Java8--Stream流

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 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");


一、篩選和切片(對流的數據進行過濾和選擇自己想要的數據)

  1. 用謂詞篩選 ==filter(T -> T.getXX())==
  2. 判斷相同 去重 ==distinct()==
  3. 截斷流 截取 ==limit(n)==
  4. 跳過元素 ==skip(n)==
  5. 排序 ==sorted(Comparator.comparing(T::getXX))==
  6. 遍歷 ==forEach(XXX)==

二、映射

  1. 對流中每一個元素應用函數 ==map()==
    ==> 一般用於提取流中的內容 map(T :: getXX)
  2. 流的扁平化 ==flatMap()==  多個流合併成一個流
    ==> 將一個流中每個值都轉換成另外一個流,然後再將轉換的所有的流鏈接成一個流

三、查找與匹配

  1. 查找至少一個匹配 ==anyMatch()==
  2. 查找是全匹配 ==allMatch()==
    對應的無匹配是 ==noneMatch()==
  3. 查找任意元素 ==findAny()==
  4. 查找第一個元素 ==findFirst()==
  5. 查找最小/最大的

四、歸約(就是將流中的所有元素經過指定運算,摺疊成一個元素輸出)

  1. 求和 ==reduce(初始值,Integer :: sum)==
  1. 求最大最小 ==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中。


下面這個博客有更詳細的實例


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章