是什么是Stream流

java.util.stream.Stream

Stream流和传统的IO流,它们都叫流,却是两个完全不一样的概念和东西。

流可以简单的说是处理数据集合的东西,可以申明式流式API来处理集合,而不是写一个逻辑实现。

流分类

流分为顺序流及并行流,顺序流即每个指令按顺序执行,并行流即集合里面的操作并行执行。

  1. List<Integer> numbers = Arrays.asList(1, 2, 3);
  2. // 顺序流
  3. numbers.stream().forEach(n -> System.out.print(n));
  4. //并行流
  5. numbers.parallelStream().forEach(n -> System.out.print(n));

以上例子,顺序流总是输出123,而并行流则每次结果都不一定,并行流使用了ForkJoinPool分而治之,所以明白了ForkJoinPool原理的同学就知道并行流的真面目了。

创建流

1、调用集合的stream()方法或者parallelStream()方法。

2、Stream.of()方法,有针对int,long的专用流IntStream,LongStream。

使用流

以下举了流的一些常用的用法。

  1. public class StreamTest {
  2. public static void main(String[] args) {
  3. System.out.println("过滤-找出年纪大于18岁的人");
  4. List<User> list = initList();
  5. list.stream().filter((User user) -> user.getAge() > 18).collect(Collectors.toList())
  6. .forEach(System.out::println);
  7. System.out.println();
  8. System.out.println("最大值-找出最大年纪的人");
  9. list = initList();
  10. Optional<User> max = list.stream().max((u1, u2) -> u1.getAge() - u2.getAge());
  11. System.out.println(max.get());
  12. System.out.println();
  13. System.out.println("映射-规纳-求所有人的年纪总和");
  14. list = initList();
  15. Optional<Integer> reduce = list.stream().map(User::getAge).reduce(Integer::sum);
  16. System.out.println(reduce.get());
  17. System.out.println();
  18. System.out.println("分组-按年纪分组");
  19. list = initList();
  20. Map<Integer, List<User>> userMap = list.stream()
  21. .collect(Collectors.groupingBy(User::getAge));
  22. MapUtils.verbosePrint(System.out, null, userMap);
  23. System.out.println();
  24. System.out.println("创建-去重-统计");
  25. Stream<User> userStream = Stream
  26. .of(new User("u1", 1), new User("u2", 21), new User("u2", 21));
  27. System.out.println(userStream.distinct().count());
  28. System.out.println();
  29. }
  30. public static List<User> initList() {
  31. List<User> list = new ArrayList<>();
  32. list.add(new User("oaby", 23));
  33. list.add(new User("tom", 11));
  34. list.add(new User("john", 16));
  35. list.add(new User("jennis", 26));
  36. list.add(new User("tin", 26));
  37. list.add(new User("army", 26));
  38. list.add(new User("mack", 19));
  39. list.add(new User("jobs", 65));
  40. list.add(new User("jordan", 23));
  41. return list;
  42. }
  43. }

输出结果:

  1. 过滤-找出年纪大于18岁的人
  2. User [username=oaby, age=23]
  3. User [username=jennis, age=26]
  4. User [username=tin, age=26]
  5. User [username=army, age=26]
  6. User [username=mack, age=19]
  7. User [username=jobs, age=65]
  8. User [username=jordan, age=23]
  9. 最大值-找出最大年纪的人
  10. User [username=jobs, age=65]
  11. 映射-规纳-求所有人的年纪总和
  12. 235
  13. 分组-按年纪分组
  14. {
  15. 16 = [User [username=john, age=16]]
  16. 65 = [User [username=jobs, age=65]]
  17. 19 = [User [username=mack, age=19]]
  18. 23 = [User [username=oaby, age=23], User [username=jordan, age=23]]
  19. 26 = [User [username=jennis, age=26], User [username=tin, age=26], User [username=army, age=26]]
  20. 11 = [User [username=tom, age=11]]
  21. }
  22. 创建-去重-统计
  23. 2

可以看出流操作数据集合很强大吧,但需要注意的是流只能执行一次,再次使用需要重要打开。

更多的玩法可以自己去研究吧。

推荐阅读

干货:免费领取2TB架构师四阶段视频教程

面经:史上最全Java多线程面试题及答案

工具:推荐一款在线创作流程图、思维导图软件

分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。

JDK8新特性之Stream流的更多相关文章

  1. JDK8新特性关于Stream流

    在Java1.8之前还没有stream流式算法的时候,我们要是在一个放有多个User对象的list集合中,将每个User对象的主键ID取出,组合成一个新的集合,首先想到的肯定是遍历,如下: 1 2 3 ...

  2. Java 8 新特性之 Stream 流基础体验

    Java 8 新特性之 Stream 流基础体验 package com.company; import java.util.ArrayList; import java.util.List; imp ...

  3. 乐字节-Java8新特性之Stream流(上)

    上一篇文章,小乐给大家介绍了<Java8新特性之方法引用>,下面接下来小乐将会给大家介绍Java8新特性之Stream,称之为流,本篇文章为上半部分. 1.什么是流? Java Se中对于 ...

  4. java1.8新特性之stream流式算法

    在Java1.8之前还没有stream流式算法的时候,我们要是在一个放有多个User对象的list集合中,将每个User对象的主键ID取出,组合成一个新的集合,首先想到的肯定是遍历,如下: List& ...

  5. 【Java8新特性】- Stream流

    Java8新特性 - Stream流的应用 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! ...

  6. java8新特性之stream流

    Stream 流是 Java 8 提供给开发者一套新的处理集合的API,他把我们将要处理的集合作为流,就像流水线一样,我们可以对其中的元素进行筛选,过滤,排序等中间操作,只不过这种操作更加简洁高效. ...

  7. Java8新特性之Stream流(含具体案例)

    一.概述   Stream 流是 Java 8 新提供给开发者的一组操作集合的 API,将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选.排序.聚合等.元素 ...

  8. JDK8新特性之stream

    stream中有很多方法,讲一些常用的. 1.forEach(),遍历方法,很简单,对于一般的遍历可以替代for循环 List<String> strings = Arrays.asLis ...

  9. jdk8新特性---list.stream

    项目中用到了该api ,记录下来 具有get set 构造方法的实体类 开始使用: 结果为: 更多可以参考: https://blog.csdn.net/justloveyou_/article/de ...

随机推荐

  1. 25. SPI

  2. Rsync 实现服务器文件的同步——服务端的安装配置

    一.安装rsync 直接使用yum命令进行安装即可. yum -y install rsync 二.配置文件 网上大多教程都说安装是默认没有配置文件的,但是经过我的尝试,yum安装下默认是有配置文件的 ...

  3. 对 HTTP HTTPS的认识

    1.HTTP:超文本传输协议 -以明文的形式传输 -效率更高,但是不安全 2.HTTPS:HTTP+SSL -传输之前数据先加密,之后在揭秘 -效率低,但是安全 3.get请求和post请求的区别 - ...

  4. 修改maven包本地默认位置

    前言 这段时间上岸了,就有时间整理电脑的资料(强迫症重度患者),就向maven以及gradle的仓库位置动手了. 目的 改变maven的默认位置 步骤 修改maven的配置文件setting.xml( ...

  5. multipart/form-data,application/json和application/x-www-form-urlencoded区别

    application/json和application/x-www-form-urlencoded都是表单数据发送时的编码类型. EncType: enctype 属性规定在发送到服务器之前应该如何 ...

  6. android中使用MediaPlayer和SurfaceView播放视频

    package com.test.video; import java.io.IOException; import android.media.AudioManager; import androi ...

  7. Java web 应用自启动 shell脚本自动重启

    之前公司的内部管理系统jenkins自动构建代码有时候会失效,导致服务停掉. 于是乎就搞了一个自动启动脚本. oa.jar就是监测的服务 startup.sh 的内容是运行jar包的命令 java - ...

  8. 取消SVN感叹号即去除版本库

    之前不小心直接将版本库 的内容检出 到桌面,后才发现桌面上的文件 都变成了问号,本来也以为没有多大问题,删除 .svn 即可,可是删除所有的.svn后,桌面上还是显示问号,刷新了很多次,还重启电脑 了 ...

  9. Spring下载maven

    http://maven.springframework.org/release/org/springframework/spring/

  10. go类c语法

    go类c语法 一般来说,如果一门语言具有类c语法,意味着当你习惯使用其他类c语言例如c.c++.java.javascript和c#,然后你就会发现go语言和它们也类似,至少表面上是.例如,使用&am ...