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类型

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值