java中stream流使用分享

背景

         java8.0中新推出了stream方法,增強了對集合的操作。代碼更優雅,更具有可讀性

基本概念

       串行流:逐個計算

       並行流:將流切成多份(fork),分別計算,然後組裝(join)    慎重使用,有可能有副作用

       注:可通過parallel() -> 並行流、sequential() -> 串行流方便的在兩種類型中變化

      流執行都是懶加載模式,只有在使用的時候纔會執行。最好的方式是先減少數量,在進行操作。

案例:某班有50個學生,語文成績分別爲50~99

 

基本語法

     過濾:filter

     假如我們需要找到成績在60分以下的學生

     studentList.stream().filter({it.getAt("grade")<=60}).collect(Collectors.toList())

     result : [[grade:50, id:0], [grade:51, id:1], [grade:52, id:2], [grade:53, id:3], [grade:54, id:4], [grade:55, id:5], [grade:56, id:6], [grade:57, id:7], [grade:58, id:8], [grade:59, id:9], [grade:60, id:10]]

     映射:map

     假如我們需要將60分以下的成績不顯示設置爲不及格

     studentList.stream().map({if(it.getAt("grade")<=60){it.putAt("grade", "不及格");};return it;}).collect(Collectors.toList())

    

    result : [[grade:不及格, id:0], [grade:不及格, id:1], [grade:不及格, id:2], [grade:不及格, id:3], [grade:不及格, id:4], [grade:不及格, id:5], [grade:不及格, id:6], [grade:不及格, id:7], [grade:不及格, id:8], [grade:不及格, id:9], [grade:不及格, id:10], [grade:61, id:11], [grade:62, id:12], [grade:63, id:13], [grade:64,                    id:14], [grade:65, id:15], [grade:66, id:16], [grade:67, id:17], [grade:68, id:18], [grade:69, id:19], [grade:70, id:20], [grade:71, id:21], [grade:72, id:22], [grade:73, id:23], [grade:74, id:24], [grade:75, id:25], [grade:76, id:26], [grade:77, id:27], [grade:78, id:28], [grade:79, id:29], [grade:80, id:30],                          [grade:81, id:31], [grade:82, id:32], [grade:83, id:33], [grade:84, id:34], [grade:85, id:35], [grade:86, id:36], [grade:87, id:37], [grade:88, id:38], [grade:89, id:39], [grade:90, id:40], [grade:91, id:41], [grade:92, id:42], [grade:93, id:43], [grade:94, id:44], [grade:95, id:45], [grade:96, id:46], [grade:97,                   id:47], [grade:98, id:48], [grade:99, id:49]]

   限制大小:limit|skip

   取出前一個元素

   studentList.stream().limit(1).collect(Collectors.toList())

   result : [[grade:50, id:0]]

   扔掉前五個元素

   studentList.stream().skip(5).collect(Collectors.toList())

   result : [[grade:55, id:5], [grade:56, id:6], [grade:57, id:7], [grade:58, id:8], [grade:59, id:9], [grade:60, id:10], [grade:61, id:11], [grade:62, id:12], [grade:63, id:13], [grade:64, id:14], [grade:65, id:15], [grade:66, id:16], [grade:67, id:17], [grade:68, id:18], [grade:69, id:19], [grade:70, id:20], [grade:71,                             id:21], [grade:72, id:22], [grade:73, id:23], [grade:74, id:24], [grade:75, id:25], [grade:76, id:26], [grade:77, id:27], [grade:78, id:28], [grade:79, id:29], [grade:80, id:30], [grade:81, id:31], [grade:82, id:32], [grade:83, id:33], [grade:84, id:34], [grade:85, id:35], [grade:86, id:36], [grade:87, id:37],                           [grade:88, id:38], [grade:89, id:39], [grade:90, id:40], [grade:91, id:41], [grade:92, id:42], [grade:93, id:43], [grade:94, id:44], [grade:95, id:45], [grade:96, id:46], [grade:97, id:47], [grade:98, id:48], [grade:99, id:49]]

   排序:sorted

   按成績排序

   studentList.stream().sorted({ s1, s2 -> return s2.getAt("grade").compareTo(s1.getAt("grade"));}).collect(Collectors.toList())

   result : [[grade:99, id:49], [grade:98, id:48], [grade:97, id:47], [grade:96, id:46], [grade:95, id:45], [grade:94, id:44], [grade:93, id:43], [grade:92, id:42], [grade:91, id:41], [grade:90, id:40], [grade:89, id:39], [grade:88, id:38], [grade:87, id:37], [grade:86, id:36], [grade:85, id:35], [grade:84, id:34], [grade:83,                   id:33], [grade:82, id:32], [grade:81, id:31], [grade:80, id:30], [grade:79, id:29], [grade:78, id:28], [grade:77, id:27], [grade:76, id:26], [grade:75, id:25], [grade:74, id:24], [grade:73, id:23], [grade:72, id:22], [grade:71, id:21], [grade:70, id:20], [grade:69, id:19], [grade:68, id:18], [grade:67, id:17],                           [grade:66, id:16], [grade:65, id:15], [grade:64, id:14], [grade:63, id:13], [grade:62, id:12], [grade:61, id:11], [grade:60, id:10], [grade:59, id:9], [grade:58, id:8], [grade:57, id:7], [grade:56, id:6], [grade:55, id:5], [grade:54, id:4], [grade:53, id:3], [grade:52, id:2], [grade:51, id:1], [grade:50, id:0]]

  去重:distinct

  取出成績分佈數量

  Map student = new HashMap();

  student.put("id", 50);
  student.put("grade", 50);

  studentList.add(student);

  studentList.stream().map({it.getAt("grade")}).collect(Collectors.toList()).size()                                                                      result : 51

  studentList.stream().map({it.getAt("grade")}).distinct().collect(Collectors.toList()).size()                                                       result : 50

  注:使用distinct需要注意實現hashCode和equals.

 完全匹配:allMatch

 學生成績是否都在60分以上

  studentList.stream().map({it.getAt("grade")}).allMatch({it>=60})                                                                                              result : false

 學生成績是否都在50分以上

  studentList.stream().map({it.getAt("grade")}).allMatch({it>=50})                                                                                              result : true

 存在匹配:anyMatch

 學生成績是否存在90分以上

 studentList.stream().map({it.getAt("grade")}).anyMatch({it>=90})                                                                                           result :true

學生成績是否存在100分

 studentList.stream().map({it.getAt("grade")}).anyMatch({it==100})                                                                                         result :false

 無匹配:noneMatch

 學生成績是否都在90分以下

 studentList.stream().map({it.getAt("grade")}).noneMatch({it>=90})                                                                                           result :false

學生成績是否都沒有達到100分

 studentList.stream().map({it.getAt("grade")}).noneMatch({it==100})                                                                                         result :true

 找到第一個:findFirst

 studentList.stream().findFirst().get()                                                                                                                                          result:[grade:50, id:0]

 找到任何一個:findAny

 studentList.stream().parallel().findAny().get()                                                                                                                            result:[grade:81, id:31]

 生成stream:iterate

 手動生成一個1~50的數組

 Stream.iterate(1,{i -> i+1}).limit(50).collect(Collectors.toList())

 最值:min|max

 取出成績最高的那個

 studentList.stream().max({s1,s2 -> return s1.getAt("grade")-s2.getAt("grade")}).get()                                                           result:[grade:99, id:49]

 取出成績最差的那個

 studentList.stream().min({s1,s2 -> return s1.getAt("grade")-s2.getAt("grade")}).get()                                                           result:[grade:50, id:0]

 注:min() max()返回的對象是Optional類型

 

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