业务开发过程中,经常会需要将集合中的数据进行聚合操作。比如:取出订单集合中有效订单的数据、按照订单类型做分组等等。以前的处理方式会遍历这个集合然后通过业务判断做处理,虽然可用,但远不够高效且笨拙。
为什么需要Stream
Stream是Java8的一大亮点,是对集合对象(Collection)功能的增强,进行聚合操作、批量数据操作。同时借助于Lambda表达式,提高编程效率和可读性。此外,Stream提供了并发模式,可充分使用多核处理器的优势,底层使用fork/join 并行方式来拆分任务和加速处理过程。
什么是Stream流
Stream不保存数据,也不是一种数据结构,更不是集合元素,而是有关算法和计算的,就像Iterator,只是更高级。Stream会隐式的在内部进行遍历,做出对应的数据转换。Stream类比于迭代器(Iterator)去理解,是单向、不可往复、只能遍历一次。
但是,迭代器只能串行化操作,也就是说用迭代器去遍历时,每个item 读完后再读下一个 item。Stream的并行操作依赖于Java7引入的Fork/Join 框架(JSR166y)来拆分任务和加速处理。
list.stream():串行遍历;
list.parallelStream():并行处理;
Stream之groupingBy
groupingBy是都集合进行分组,分组之后的结果形如Map<key,List>。其中,key是进行分组的字段类型,比如按Ussr类中的type(用户类型:1、2、3、4)进行分组,type的类型为Integer,分组之后的Map的key类型就是Integer。并且最多会分成四组,所以最后的结果即Map<Integer,List>。
假设我们想用户类型为1的集合,首先先进行分组,如:
Map<Integer,List<User>> userMap = allUserList.paralle

本文介绍了Java8 Stream的新特性,探讨了为什么需要Stream以及Stream的基本概念。重点讲解了groupingBy和partitioningBy的区别与用法,通过实例展示了如何使用这两个方法进行数据分组和分区,并提醒了在使用过程中需要注意的坑,如分组时key不存在的情况和处理效率问题。
最低0.47元/天 解锁文章





