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