是什么是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流相关推荐

  1. 带你看看JDK8新特性:Stream流

    相信兄弟萌在学习时碰到过这样的代码吧: List<String> list = new ArrayList(); list.stream().forEach(a-> System.o ...

  2. 15.JDK8新特性之Stream流

    什么是 Stream Stream(流)是一个来自数据源的元素队列并支持聚合操作 1)元素是特定类型的对象,形成一个队列. Java中的Stream并不会存储元素,而是按需计算. 2)数据源 流的来源 ...

  3. JDK8新特性--用stream流将String转数组

    传参ids为用,分开的字符串 String[] sysModuleIds = ids.split(",");List list = Arrays.stream(sysModuleI ...

  4. 使用Java8新特性(stream流、Lambda表达式)实现多个List 的笛卡尔乘积 返回需要的List<JavaBean>

    需求分析: 有两个Long类型的集合 : List<Long> tagsIds; List<Long> attributesIds; 现在需要将这两个Long类型的集合进行组合 ...

  5. 跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局

    转载自   跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局 恭喜你们,马上就要学完Java8 Stream流的一整系列了,其实我相信Stream流对很多使用Java的同 ...

  6. 跟我学 Java 8 新特性之 Stream 流(六)收集

    转载自   跟我学 Java 8 新特性之 Stream 流(六)收集 我们前面的五篇文章基本都是在说将一个集合转成一个流,然后对流进行操作,其实这种操作是最多的,但有时候我们也是需要从流中收集起一些 ...

  7. 跟我学 Java 8 新特性之 Stream 流基础体验

    转载自   跟我学 Java 8 新特性之 Stream 流基础体验 Java8新增的功能中,要数lambda表达式和流API最为重要了.这篇文章主要介绍流API的基础,也是流API系列的第一篇文章, ...

  8. 跟我学 Java 8 新特性之 Stream 流(二)关键知识点

    转载自   跟我学 Java 8 新特性之 Stream 流(二)关键知识点 我们的第一篇文章,主要是通过一个Demo,让大家体验了一下使用流API的那种酣畅淋漓的感觉.如果你没有实践,我还是再次呼吁 ...

  9. 跟我学 Java 8 新特性之 Stream 流(三)缩减操作

    转载自   跟我学 Java 8 新特性之 Stream 流(三)缩减操作 和前面两篇文章一起服用,效果会更佳.通过对流API的基础体验Demo和关键知识点的讲解,相信大家对流API都有一定的认识了, ...

最新文章

  1. 解决使用requests_html模块,req.html.render()下载chromium速度慢问题
  2. 计算机专业有python课程吗-作为计算机专业学生,最应该学习的课程前五位是什么?...
  3. NOKIA Update for Windows Phone
  4. Tomcat 上添加虚拟相对路径
  5. curl post https_Linux命令cURL详解,并实现文件定时上传到ftp服务器的程序
  6. 阿里P8架构师谈:大数据架构设计(文章合集)
  7. starops 云效运维 文档_阿里云 SAE 携手云效助力「石家庄掌讯」持续交付、降本提效...
  8. python画曲线图-python画蝴蝶曲线图的实例
  9. spring aop示例_Spring批处理示例
  10. atom无法安装插件的解决方法之一
  11. 简述hdfs工作原理_HDFS 原理简述
  12. php sjis,【通译】PHP中文字编码变换时使用SJIS-win而非SJIS,使用eucJP-win而非EUC-JP...
  13. 以业务流程为框架的企业组织设计
  14. Smartbi:用Excel制作移动端的九型人格测试
  15. 初学者,学哪一种3d模型设计软件比较好?
  16. python生成词云图、特殊图形_Python模块---Wordcloud生成词云图
  17. 【BFS】Oliver的救援
  18. jdk安装 系统找不到文件C:\ProgramData\Oracle\Java\javapath\java.exe
  19. c语言开发桌面应用合适吗,什么编程语言比较适合开发桌面应用程序?
  20. 一文理解完美二叉树, 完全二叉树和完满二叉树

热门文章

  1. mixed content 混合内容
  2. 分享26个关于Java开发视频教程(免费下载)
  3. Delphi面向对象编程的20条规则
  4. 11月2日科技联播:销量不及预期苹果市值跌破万亿美元;腾讯表示封杀抖音因微信规则...
  5. 转载:Java 内存区域和GC机制
  6. 【EF】EF扩展库(批量操作)
  7. 我很高兴找了一张可以说明:为什么软件开发那么困难的图
  8. LA 3507 Keep the Customer Satisfied (Greedy)
  9. 你真的了解C#中的值和引用吗?(上)
  10. MAXIMO启动中心设置