java根据条件从list中筛选出符合条件的集合_Java8:2万字20
个实例玩转集合—筛。。。
Java8 Stream
先贴上⼏个案例,⽔平⾼超的同学可以挑战⼀下:
1. 从员⼯集合中筛选出salary⼤于8000的员⼯,并放置到新的集合⾥。
2. 统计员⼯的最⾼薪资、平均薪资、薪资之和。
3. 将员⼯按薪资从⾼到低排序,同样薪资者年龄⼩者在前。
4. 将员⼯按性别分类,将员⼯按性别和地区分类,将员⼯按薪资是否⾼于8000分为两部分。
⽤传统的迭代处理也不是很难,但代码就显得冗余了,跟Stream相⽐⾼下⽴判。
1 Stream概述
Java 8 是⼀个⾮常成功的版本,这个版本新增的Stream,配合同版本出现的 Lambda ,给我们操作集合(Collection)提供了极⼤的便利。那么什么是Stream?
Stream将要处理的元素集合看作⼀种流,在流的过程中,借助Stream API对流中的元素进⾏操作,⽐如:筛选、排序、聚合等。Stream可以由数组或集合创建,对流的操作分为两种:
1. 中间操作,每次返回⼀个新的流,可以有多个。
2. 终端操作,每个流只能进⾏⼀次终端操作,终端操作结束后流⽆法再次使⽤。终端操作会产⽣⼀个新的集合或值。
另外,Stream有⼏个特性:
1. stream不存储数据,⽽是按照特定的规则对数据进⾏计算,⼀般会输出结果。
2. stream不会改变数据源,通常情况下会产⽣⼀个新的集合或⼀个值。
3. stream具有延迟执⾏特性,只有调⽤终端操作时,中间操作才会执⾏。
2 Stream的创建
Stream可以通过集合数组创建。
1、通过 java.util.Collection.stream() ⽅法⽤集合创建流
r语言中header是什么意思List list = Arrays.asList("a", "b", "c");// 创建⼀个顺序流Stream stream = list.stream();// 创建⼀个并⾏流Stream parallelStream = list.parallelStream();
2、使⽤java.util.Arrays.stream(T[] array)⽅法⽤数组创建流
int[] array={1,3,5,6,8};IntStream stream = Arrays.stream(array);
3、使⽤Stream的静态⽅法:of()、iterate()、generate()
Stream stream = Stream.of(1, 2, 3, 4, 5, 6);Stream stream2 = Stream.iterate(0, (x) -> x + 3).limit(4);stream2.forEach(System.out::println); // 0 2 4 6 8 10Stream st 输出结果:
mysql菜鸟教程字符串型0 3 6 9
0.6796156909271994
0.1914314208854283
0.8116932592396652
stream和parallelStream的简单区分: stream是顺序流,由主线程按顺序对流执⾏操作,⽽parallelStream是并⾏流,内部以多线程并
⾏执⾏的⽅式对流进⾏操作,但前提是流中的数据处理没有顺序要求。例如筛选集合中的奇数,两者的处理不同之处:
如果流中的数据量⾜够⼤,并⾏流可以加快处速度。
除了直接创建并⾏流,还可以通过parallel()把顺序流转换成并⾏流:
Optional findFirst = list.stream().parallel().filter(x->x>6).findFirst();
3 Stream的使⽤
在使⽤stream之前,先理解⼀个概念:Optional 。
Optional类是⼀个可以为null的容器对象。如果值存在则isPresent()⽅法会返回true,调⽤get()⽅法会返回该对象。
更详细说明请见:菜鸟教程Java 8 Optional类
接下来,⼤批代码向你袭来!我将⽤20个案例将Stream的使⽤整得明明⽩⽩,只要跟着敲⼀遍代码,就能很好地掌握。
案例使⽤的员⼯类
用smart原则做一个计划这是后⾯案例中使⽤的员⼯类:
List personList = new ArrayList();personList.add(new Person("Tom", 8900, "male", "New York"));personList.add(new Person("Jack", 7000, "male", "Washington"))
慕课人工客服3.1 遍历/匹配(foreach/find/match)
Stream也是⽀持类似集合的遍历和匹配元素的,只是Stream中的元素是以Optional类型存在的。Stream的遍历、匹配⾮常简单。
/
/ import已省略,请⾃⾏添加,后⾯代码亦是public class StreamTest {public static void main(String[] args) { List list = Arrays.asList(7, 6, 9, 3, 8, 2, 1); // 遍
3.2 筛选(filter)
筛选,是按照⼀定的规则校验流中的元素,将符合条件的元素提取到新的流中的操作。
案例⼀:筛选出Integer集合中⼤于7的元素,并打印出来
public class StreamTest {public static void main(String[] args) {List list = Arrays.asList(6, 7, 3, 8, 1, 2, 9);Stream stream = list.stream();stream.filter(x -> x > 7).forE 预期结果:
8 9
案例⼆: 筛选员⼯中⼯资⾼于8000的⼈,并形成新的集合。 形成新集合依赖collect(收集),后⽂有详细介绍。
public class StreamTest {public static void main(String[] args) {List personList = new ArrayList();personList.add(new Person("Tom", 8900, 23, "male", "New York")运⾏结果:
⾼于8000的员⼯姓名:[Tom, Anni, Owen]
3.3 聚合(max/min/count)
max、min、count这些字眼你⼀定不陌⽣,没错,在mysql中我们常⽤它们进⾏数据统计。Java stream中也引⼊了这些概念和⽤法,极
⼤地⽅便了我们对集合、数组的数据统计⼯作。
案例⼀:获取String集合中最长的元素。
public class StreamTest {public static void main(String[] args) {List list = Arrays.asList("adnm", "admmt", "pot", "xbangd", "weoujgsd");Optional max = list.stream().输出结果:
最长的字符串:weoujgsd
案例⼆:获取Integer集合中的最⼤值。
public class StreamTest {public static void main(String[] args) {List list = Arrays.asList(7, 6, 9, 4, 11, 6);// ⾃然排序Optional max = list.stream().max(Integer::compa 输出结果:
⾃然排序的最⼤值:11
⾃定义排序的最⼤值:11
案例三:获取员⼯⼯资最⾼的⼈。
public class StreamTest {public static void main(String[] args) {List personList = new ArrayList();personList.add(new Person("Tom", 8900, 23, "male", "New York")输出结果:
员⼯⼯资最⼤值:9500
案例四:计算Integer集合中⼤于6的元素的个数。
import java.util.Arrays;import java.util.List;public class StreamTest {public static void main(String[] args) {List list = Arrays.asList(7, 6, 4, 8, 2, 11, 9);long count = lis 输出结果:
list中⼤于6的元素个数:4
3.4 映射(map/flatMap)
input是什么数据类型映射,可以将⼀个流的元素按照⼀定的映射规则映射到另⼀个流中。分为map和flatMap:
map:接收⼀个函数作为参数,该函数会被应⽤到每个元素上,并将其映射成⼀个新的元素。
jsp技术是服务器端的技术flatMap:接收⼀个函数作为参数,将流中的每个值都换成另⼀个流,然后把所有流连接成⼀个流。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论