JDK8新特性之Stream流
是什么是Stream流
java.util.stream.Stream
Stream流和传统的IO流,它们都叫流,却是两个完全不一样的概念和东西。
流可以简单的说是处理数据集合的东西,可以申明式流式API来处理集合,而不是写一个逻辑实现。
流分类
流分为顺序流及并行流,顺序流即每个指令按顺序执行,并行流即集合里面的操作并行执行。
List<Integer> numbers = Arrays.asList(1, 2, 3);// 顺序流
numbers.stream().forEach(n -> System.out.print(n));//并行流
numbers.parallelStream().forEach(n -> System.out.print(n));
以上例子,顺序流总是输出123
,而并行流则每次结果都不一定,并行流使用了ForkJoinPool分而治之,所以明白了ForkJoinPool原理的同学就知道并行流的真面目了。
创建流
1、调用集合的stream()方法或者parallelStream()方法。
2、Stream.of()方法,有针对int,long的专用流IntStream,LongStream。
使用流
以下举了流的一些常用的用法。
public class StreamTest {public static void main(String[] args) {System.out.println("过滤-找出年纪大于18岁的人");List<User> list = initList();list.stream().filter((User user) -> user.getAge() > 18).collect(Collectors.toList()).forEach(System.out::println);System.out.println();System.out.println("最大值-找出最大年纪的人");list = initList();Optional<User> max = list.stream().max((u1, u2) -> u1.getAge() - u2.getAge());System.out.println(max.get());System.out.println();System.out.println("映射-规纳-求所有人的年纪总和");list = initList();Optional<Integer> reduce = list.stream().map(User::getAge).reduce(Integer::sum);System.out.println(reduce.get());System.out.println();System.out.println("分组-按年纪分组");list = initList();Map<Integer, List<User>> userMap = list.stream().collect(Collectors.groupingBy(User::getAge));MapUtils.verbosePrint(System.out, null, userMap);System.out.println();System.out.println("创建-去重-统计");Stream<User> userStream = Stream.of(new User("u1", 1), new User("u2", 21), new User("u2", 21));System.out.println(userStream.distinct().count());System.out.println();}public static List<User> initList() {List<User> list = new ArrayList<>();list.add(new User("oaby", 23));list.add(new User("tom", 11));list.add(new User("john", 16));list.add(new User("jennis", 26));list.add(new User("tin", 26));list.add(new User("army", 26));list.add(new User("mack", 19));list.add(new User("jobs", 65));list.add(new User("jordan", 23));return list;}}
输出结果:
过滤-找出年纪大于18岁的人
User [username=oaby, age=23]
User [username=jennis, age=26]
User [username=tin, age=26]
User [username=army, age=26]
User [username=mack, age=19]
User [username=jobs, age=65]
User [username=jordan, age=23]最大值-找出最大年纪的人
User [username=jobs, age=65]映射-规纳-求所有人的年纪总和
235分组-按年纪分组
{16 = [User [username=john, age=16]]65 = [User [username=jobs, age=65]]19 = [User [username=mack, age=19]]23 = [User [username=oaby, age=23], User [username=jordan, age=23]]26 = [User [username=jennis, age=26], User [username=tin, age=26], User [username=army, age=26]]11 = [User [username=tom, age=11]]
}创建-去重-统计
2
可以看出流操作数据集合很强大吧,但需要注意的是流只能执行一次,再次使用需要重要打开。
更多的玩法可以自己去研究吧。
推荐阅读
什么是Spring Boot?
Spring Boot开启的2种方式
Spring Boot Starters启动器
Spring Boot定制启动图案
Spring Boot核心配置
Spring Boot功能实战
Spring Boot自动配置原理、实战
Spring Boot Runner启动器
Spring Boot - Profile不同环境配置
看完有没有收获?分享到朋友圈给更多的人吧。
JDK8新特性之Stream流相关推荐
- 带你看看JDK8新特性:Stream流
相信兄弟萌在学习时碰到过这样的代码吧: List<String> list = new ArrayList(); list.stream().forEach(a-> System.o ...
- 15.JDK8新特性之Stream流
什么是 Stream Stream(流)是一个来自数据源的元素队列并支持聚合操作 1)元素是特定类型的对象,形成一个队列. Java中的Stream并不会存储元素,而是按需计算. 2)数据源 流的来源 ...
- JDK8新特性--用stream流将String转数组
传参ids为用,分开的字符串 String[] sysModuleIds = ids.split(",");List list = Arrays.stream(sysModuleI ...
- 使用Java8新特性(stream流、Lambda表达式)实现多个List 的笛卡尔乘积 返回需要的List<JavaBean>
需求分析: 有两个Long类型的集合 : List<Long> tagsIds; List<Long> attributesIds; 现在需要将这两个Long类型的集合进行组合 ...
- 跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局
转载自 跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局 恭喜你们,马上就要学完Java8 Stream流的一整系列了,其实我相信Stream流对很多使用Java的同 ...
- 跟我学 Java 8 新特性之 Stream 流(六)收集
转载自 跟我学 Java 8 新特性之 Stream 流(六)收集 我们前面的五篇文章基本都是在说将一个集合转成一个流,然后对流进行操作,其实这种操作是最多的,但有时候我们也是需要从流中收集起一些 ...
- 跟我学 Java 8 新特性之 Stream 流基础体验
转载自 跟我学 Java 8 新特性之 Stream 流基础体验 Java8新增的功能中,要数lambda表达式和流API最为重要了.这篇文章主要介绍流API的基础,也是流API系列的第一篇文章, ...
- 跟我学 Java 8 新特性之 Stream 流(二)关键知识点
转载自 跟我学 Java 8 新特性之 Stream 流(二)关键知识点 我们的第一篇文章,主要是通过一个Demo,让大家体验了一下使用流API的那种酣畅淋漓的感觉.如果你没有实践,我还是再次呼吁 ...
- 跟我学 Java 8 新特性之 Stream 流(三)缩减操作
转载自 跟我学 Java 8 新特性之 Stream 流(三)缩减操作 和前面两篇文章一起服用,效果会更佳.通过对流API的基础体验Demo和关键知识点的讲解,相信大家对流API都有一定的认识了, ...
最新文章
- 解决使用requests_html模块,req.html.render()下载chromium速度慢问题
- 计算机专业有python课程吗-作为计算机专业学生,最应该学习的课程前五位是什么?...
- NOKIA Update for Windows Phone
- Tomcat 上添加虚拟相对路径
- curl post https_Linux命令cURL详解,并实现文件定时上传到ftp服务器的程序
- 阿里P8架构师谈:大数据架构设计(文章合集)
- starops 云效运维 文档_阿里云 SAE 携手云效助力「石家庄掌讯」持续交付、降本提效...
- python画曲线图-python画蝴蝶曲线图的实例
- spring aop示例_Spring批处理示例
- atom无法安装插件的解决方法之一
- 简述hdfs工作原理_HDFS 原理简述
- php sjis,【通译】PHP中文字编码变换时使用SJIS-win而非SJIS,使用eucJP-win而非EUC-JP...
- 以业务流程为框架的企业组织设计
- Smartbi:用Excel制作移动端的九型人格测试
- 初学者,学哪一种3d模型设计软件比较好?
- python生成词云图、特殊图形_Python模块---Wordcloud生成词云图
- 【BFS】Oliver的救援
- jdk安装 系统找不到文件C:\ProgramData\Oracle\Java\javapath\java.exe
- c语言开发桌面应用合适吗,什么编程语言比较适合开发桌面应用程序?
- 一文理解完美二叉树, 完全二叉树和完满二叉树