写在前面

Java8中有两大最为重要的改变。第一个是 Lambda 表达式;另外一个则是 Stream API(java.util.stream.*)  ,那什么是Stream API呢?Java8中的Stream又该如何使用呢?

什么是Stream?

Java8中有两大最为重要的改变。第一个是 Lambda 表达式;另外一个则是 Stream API(java.util.stream.*)。

Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式

流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。“集合讲的是数据,流讲的是计算!”

注意:
① Stream 自己不会存储元素。
② Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。
③ Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。

Stream操作的三个步骤

  • 创建 Stream

一个数据源(如:集合、数组), 获取一个流。

  • 中间操作

一个中间操作链,对数据源的数据进行处理。

  • 终止操作(终端操作)

一个终止操作,执行中间操作链,并产生结果 。

如何创建Stream?

Java8 中的 Collection 接口被扩展,提供了两个获取流的方法:

1.获取Stream

  • default Stream stream() : 返回一个顺序流

  • default Stream parallelStream() : 返回一个并行流

2.由数组创建Stream

Java8 中的 Arrays 的静态方法 stream() 可以获取数组流:

  • static Stream stream(T[] array): 返回一个流

重载形式,能够处理对应基本类型的数组:

  • public static IntStream stream(int[] array)

  • public static LongStream stream(long[] array)

  • public static DoubleStream stream(double[] array)

3.由值创建流

可以使用静态方法 Stream.of(), 通过显示值创建一个流。它可以接收任意数量的参数。

  • public static Stream of(T… values) : 返回一个流

4.由函数创建流

由函数创建流可以创建无限流。

可以使用静态方法 Stream.iterate() 和Stream.generate(), 创建无限流 。

  • 迭代

public static Stream iterate(final T seed, final UnaryOperatorf)

  • 生成

public static Stream generate(Suppliers)

Stream的中间操作

多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,称为“惰性求值”

1.筛选与切片

2.映射

3.排序

Stream 的终止操作

终端操作会从流的流水线生成结果。其结果可以是任何不是流的值,例如:List、 Integer,甚至是 void 。

1.查找与匹配

2.规约

3.收集

Collector 接口中方法的实现决定了如何对流执行收集操作(如收集到 List、 Set、 Map)。但是 Collectors 实用类提供了很多静态方法,可以方便地创建常见收集器实例, 具体方法与实例如下表

并行流与串行流

并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。

Java 8 中将并行进行了优化,我们可以很容易的对数据进行并行操作。Stream API 可以声明性地通过 parallel() 与
sequential() 在并行流与顺序流之间进行切换

Fork/Join 框架

1.简单概述

Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个的小任务运算的结果进行 join 汇总.


2.Fork/Join 框架与传统线程池的区别

采用 “工作窃取”模式(work-stealing):
当执行新的任务时它可以将其拆分分成更小的任务执行,并将小任务加到线程队列中,然后再从一个随机线程的队列中偷一个并把它放在自己的队列中。

相对于一般的线程池实现,fork/join框架的优势体现在对其中包含的任务的处理方式上.在一般的线程池中,如果一个线程正在执行的任务由于某些原因无法继续运行,那么该线程会处于等待状态.而在fork/join框架实现中,如果某个子问题由于等待另外一个子问题的完成而无法继续运行.那么处理该子问题的线程会主动寻找其他尚未运行的子问题来执行.这种方式减少了线程的等待时间,提高了性能。

写在最后

最后,附上Java8新特性核心知识图,祝大家在学习Java8新特性时少走弯路。

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

【Java8新特性】关于Java8的Stream API,看这一篇就够了!!相关推荐

  1. java8新特性-lambda表达式和stream API的简单使用

    一.为什么使用lambda Lambda 是一个 匿名函数,我们可以把 Lambda表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风 ...

  2. java8新特性【Lambda、Stream API、Optional、Date Time API 、并行流与串行流】

    文章目录 Lambda 表达式 Lambda 表达式的基础语法 方法引用 Lambda 表达式需要"函数式接口"的支持 Java8 内置的四大核心函数式接口 Stream API ...

  3. 【Java】Java8新特性Lambda表达式和Stream API

    Lambda表达式是实现支持函数式编程技术的基础. 函数式编程与面向对象编程:函数式编程将程序代码看作数学中的函数,函数本身作为另一个函数参数或返回值,即高阶函数.而面向对象编程按照真实世界客观事物的 ...

  4. java8新特性(4)— Stream流

    java8新特性(4)- Stream流 遍历集合更强大 package com.common.jdk8;import java.util.*; import java.util.stream.Col ...

  5. java8新特性:三,Stream

    java8新特性:三,Stream 1 Stream介绍 Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据 ...

  6. 关于亚马逊MWS API 看这一篇就够了

    关于亚马逊MWS API 看这一篇就够了 文章目录 关于亚马逊MWS API 看这一篇就够了 献给那些刚接触亚马逊MWS API的小白们 一.什么是MWS API 1.MWS API能为我们做什么 2 ...

  7. Java8新特性总结 -6.Date/Time API

    所有示例代码打包下载 : 点击打开链接 Java8新特性 :  接口新增默认方法和静态方法 Optional类 Lambda表达式 方法引用 Stream API - 函数式操作流元素集合 Date/ ...

  8. java8 lambda map排序_Java8新特性第3章(Stream API)

    转载请注明出处:https://zhuanlan.zhihu.com/p/20540202 Stream作为Java8的新特性之一,他与Java IO包中的InputStream和OutputStre ...

  9. stream of java_java8新特性之强大的Stream API

    Stream API Stream是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作. 使用Stream API 对集合数据进行操作, ...

  10. jdk8銝要onematch_JDK 8 新特性之函数式编程 → Stream API

    开心一刻 今天和朋友们去K歌,看着这群年轻人一个个唱的贼嗨,不禁感慨道:年轻真好啊! 想到自己年轻的时候,那也是拿着麦克风不放的人 现在的我没那激情了,只喜欢坐在角落里,默默的听着他们唱,就连旁边的妹 ...

最新文章

  1. Linux bash管道符“|”使用介绍与例子
  2. java中堆与栈的区别 彻底理解
  3. 算法--------旋转数组
  4. Codeforces 1012A Photo of The Sky
  5. 使用代码创建Hybris storefront订单时遇到错误No result for the given example [TitleModel (
  6. [导入]ASP.NET中上传并读取Excel文件数据
  7. 联发科固件现窃听漏洞,影响全球约三分之一的手机和物联网设备
  8. 【MyBatis】MyBatis找不到mapper文件
  9. 用手机做电脑摄像头的软件
  10. 解决三星PM981硬盘无法正常安装黑苹果的问题(第三版)
  11. 联想服务器修改ip地址,联想 lenove 3750 M4服务器更改启动项和管理口IP
  12. 3dMax模型的重置变换
  13. python图像色彩分析_Python——图像手绘效果
  14. 企业微信自建应用 网页授权登录 获取用户信息
  15. Rabbitmq取消预取机制配置,配置手动确认后仍然java.lang.IllegalStateException: Channel closed; cannot ack/nack的问题
  16. MT管理系去弹窗【失败】
  17. matlab c2d tustin,Matlab中的c2d函数用法以及绘制传函的Bode图
  18. DNS和HTTP服务
  19. 流图(程序图)表示程序的控制流——McCabe方法度量程序空间复杂度
  20. 猜数字游戏java课程设计报告

热门文章

  1. ubuntu下oracle数据的导入,导入oracle数据库命令行
  2. C语言易错题--求最大公约数与最小公倍数之和(辗转相除法)
  3. PTA基础编程题目集-7-32 说反话-加强版
  4. 用质因子去分解质因数
  5. 如何在android中水平放置三张图片,Android ACTION_VIEW多张图片
  6. closeable java_【转】java.io.Closeable接口
  7. BZOJ 2135 刷题计划(贪心,求导,二分)【BZOJ 修复工程】
  8. 0x51.动态规划 - 线性DP(习题详解 × 10)
  9. 0x11.基本数据结构 — 栈与单调栈
  10. mysql报错注入原理,MySQL报错注入