【Java8新特性】关于Java8的Stream API,看这一篇就够了!!
写在前面
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,看这一篇就够了!!相关推荐
- java8新特性-lambda表达式和stream API的简单使用
一.为什么使用lambda Lambda 是一个 匿名函数,我们可以把 Lambda表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风 ...
- java8新特性【Lambda、Stream API、Optional、Date Time API 、并行流与串行流】
文章目录 Lambda 表达式 Lambda 表达式的基础语法 方法引用 Lambda 表达式需要"函数式接口"的支持 Java8 内置的四大核心函数式接口 Stream API ...
- 【Java】Java8新特性Lambda表达式和Stream API
Lambda表达式是实现支持函数式编程技术的基础. 函数式编程与面向对象编程:函数式编程将程序代码看作数学中的函数,函数本身作为另一个函数参数或返回值,即高阶函数.而面向对象编程按照真实世界客观事物的 ...
- java8新特性(4)— Stream流
java8新特性(4)- Stream流 遍历集合更强大 package com.common.jdk8;import java.util.*; import java.util.stream.Col ...
- java8新特性:三,Stream
java8新特性:三,Stream 1 Stream介绍 Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据 ...
- 关于亚马逊MWS API 看这一篇就够了
关于亚马逊MWS API 看这一篇就够了 文章目录 关于亚马逊MWS API 看这一篇就够了 献给那些刚接触亚马逊MWS API的小白们 一.什么是MWS API 1.MWS API能为我们做什么 2 ...
- Java8新特性总结 -6.Date/Time API
所有示例代码打包下载 : 点击打开链接 Java8新特性 : 接口新增默认方法和静态方法 Optional类 Lambda表达式 方法引用 Stream API - 函数式操作流元素集合 Date/ ...
- java8 lambda map排序_Java8新特性第3章(Stream API)
转载请注明出处:https://zhuanlan.zhihu.com/p/20540202 Stream作为Java8的新特性之一,他与Java IO包中的InputStream和OutputStre ...
- stream of java_java8新特性之强大的Stream API
Stream API Stream是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作. 使用Stream API 对集合数据进行操作, ...
- jdk8銝要onematch_JDK 8 新特性之函数式编程 → Stream API
开心一刻 今天和朋友们去K歌,看着这群年轻人一个个唱的贼嗨,不禁感慨道:年轻真好啊! 想到自己年轻的时候,那也是拿着麦克风不放的人 现在的我没那激情了,只喜欢坐在角落里,默默的听着他们唱,就连旁边的妹 ...
最新文章
- Linux bash管道符“|”使用介绍与例子
- java中堆与栈的区别 彻底理解
- 算法--------旋转数组
- Codeforces 1012A Photo of The Sky
- 使用代码创建Hybris storefront订单时遇到错误No result for the given example [TitleModel (
- [导入]ASP.NET中上传并读取Excel文件数据
- 联发科固件现窃听漏洞,影响全球约三分之一的手机和物联网设备
- 【MyBatis】MyBatis找不到mapper文件
- 用手机做电脑摄像头的软件
- 解决三星PM981硬盘无法正常安装黑苹果的问题(第三版)
- 联想服务器修改ip地址,联想 lenove 3750 M4服务器更改启动项和管理口IP
- 3dMax模型的重置变换
- python图像色彩分析_Python——图像手绘效果
- 企业微信自建应用 网页授权登录 获取用户信息
- Rabbitmq取消预取机制配置,配置手动确认后仍然java.lang.IllegalStateException: Channel closed; cannot ack/nack的问题
- MT管理系去弹窗【失败】
- matlab c2d tustin,Matlab中的c2d函数用法以及绘制传函的Bode图
- DNS和HTTP服务
- 流图(程序图)表示程序的控制流——McCabe方法度量程序空间复杂度
- 猜数字游戏java课程设计报告
热门文章
- ubuntu下oracle数据的导入,导入oracle数据库命令行
- C语言易错题--求最大公约数与最小公倍数之和(辗转相除法)
- PTA基础编程题目集-7-32 说反话-加强版
- 用质因子去分解质因数
- 如何在android中水平放置三张图片,Android ACTION_VIEW多张图片
- closeable java_【转】java.io.Closeable接口
- BZOJ 2135 刷题计划(贪心,求导,二分)【BZOJ 修复工程】
- 0x51.动态规划 - 线性DP(习题详解 × 10)
- 0x11.基本数据结构 — 栈与单调栈
- mysql报错注入原理,MySQL报错注入