上一篇文章,小乐给大家介绍了《Java8新特性之方法引用》,下面接下来小乐将会给大家介绍Java8新特性之Stream,称之为流,本篇文章为上半部分。

1、什么是流?

Java Se中对于流的操作有输入输出IO流,而Java8中引入的Stream 属于Java API中的一个新成员,它允许你以声明性方式处理数据集合,Stream 使用一种类似 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。 注意这里的流操作可以看做是对集合数据的处理。

简单来说,流是一种数据渠道,用于操作数据源(集合、数组)所生产的元素序列。

元素序列 :就像集合一样,流也提供了一个接口,可以访问特定元素类型的一组有序值。

源:流会使用一个提供数据的源,如集合、数组或输入/输出资源。 请注意,从有序集 合生成流时会保留原有的顺序。由列表生成的流,其元素顺序与列表一致

数据处理操作:流的数据处理功能支持类似于数据库的操作,以及函数式编程语言中 的常用操作,如filter、 map、 reduce、 find、 match、 sort等。流操作可以顺序执 行,也可并行执行。

流水线:很多流操作本身会返回一个流,这样多个操作就可以链接起来,形成一个大 的流水线。

内部迭代:与使用迭代器显式迭代的集合不同,流的迭代操作是在背后进行的。

2、流操作

整个流操作就是一条流水线,将元素放在流水线上一个个地进行处理。需要注意的是:很多流操作本身就会返回一个流,所以多个操作可以直接连接起来, 如下图这样,操作可以进行链式调用,并且并行流还可以实现数据流并行处理操作。

3、流与集合

3.1、计算的时机

Stream 和集合的其中一个差异在于什么时候进行计算,集合,它会包含当前数据结构中所有的值,你可以随时增删,但是集合里面的元素毫无疑问地都是已经计算好了的。 流则是按需计算,按照使用者的需要计算数据,你可以想象我们通过搜索引擎进行搜索,搜索出来的条目并不是全部呈现出来的,而且先显示最符合的前 10 条或者前 20 条,只有在点击 “下一页” 的时候,才会再输出新的 10 条。

3.2、外部迭代与内部迭代

把集合比作一个工厂的仓库,一开始工厂比较落后,要对货物作什么修改,只能工人亲自走进仓库对货物进行处理,有时候还要将处理后的货物放到一个新的仓库里面。在这个时期,我们需要亲自去做迭代,一个个地找到需要的货物,并进行处理,这叫做外部迭代。 后来工厂发展了起来,配备了流水线作业,只要根据需求设计出相应的流水线,然后工人只要把货物放到流水线上,就可以等着接收成果了,而且流水线还可以根据要求直接把货物输送到相应的仓库。这就叫做内部迭代,流水线已经帮你把迭代给完成了,你只需要说要干什么就可以了(即设计出合理的流水线)。 Java 8 引入 Stream 很大程度是因为,流的内部迭代可以自动选择一种合适你硬件的数据表示和并行实现。

4、创建流

在 Java 8 中, 集合接口有两个方法来生成流:

stream()− 为集合创建串行流。

parallelStream()− 为集合创建并行流。

示例代码如下:

public static void main(String[] args) {

/**

* 定义集合l1 并为集合创建串行流

*/

List l1 = Arrays.asList("周星驰", "周杰伦", "周星星", "周润发");

// 返回串行流

l1.stream();

// 返回并行流

l1.parallelStream();

}

上述操作得到的流是通过原始数据转换过来的流,除了这种流创建的基本操作外,对于流的创建还有以下几种方式。

4.1、值创建流

Stream.of(T...) : Stream.of("aa", "bb") 生成流

//值创建流 生成一个字符串流

Stream stream = Stream.of("java8", "Spring", "SpringCloud");

stream.forEach(System.out::println);

4.2、数组创建流

根据参数的数组类型创建对应的流。

Arrays.stream(T[ ])

Arrays.stream(int[ ])

Arrays.stream(double[ ])

Arrays.stream(long[ ])

// 只取索引第 1 到第 2 位的:

int[] a = {1, 2, 3, 4};

Arrays.stream(a, 1, 3).forEach(System.out :: println);

4.3、文件生成流

//每个元素是给定文件的其中一行

Stream stream02 = Files.lines(Paths.get("data.txt"));

4.4、函数生成流

两个方法:

iterate : 依次对每个新生成的值应用函数

generate :接受一个函数,生成一个新的值

//生成流,首元素为 0,之后依次加 2

Stream.iterate(0, n -> n + 2)

//生成流,为 0 到 1 的随机双精度数

Stream.generate(Math :: random)

//生成流,元素全为 1

Stream.generate(() -> 1)

上半部分就介绍到这里,下半部分将会给大家介绍流的中间操作和终止操作。请多关注!转载请注明出处和作者。

java stream byte_乐字节-Java8新特性之Stream流(上)相关推荐

  1. java8新特性_乐字节-Java8新特性-接口默认方法

    总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...

  2. java8新特性_乐字节-Java8新特性-函数式接口

    上一篇小乐带大家学过 Java8新特性-Lambda表达式,那什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口 ...

  3. optional判断是否为空_乐字节Java8核心特性之Optional

    小伙伴们,上次小乐给大家详细介绍了Java8核心特性的Stream(流),点击可以回顾哦. 乐字节:乐字节Java8核心特性实战-Stream流​zhuanlan.zhihu.com Optional ...

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

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

  5. 【java8新特性】——Stream API详解(二)

    一.简介 java8新添加了一个特性:流Stream.Stream让开发者能够以一种声明的方式处理数据源(集合.数组等),它专注于对数据源进行各种高效的聚合操作(aggregate operation ...

  6. Java8新特性:Stream介绍和总结

    Java8新特性:Stream介绍和总结 什么是Stream 流(Stream)是数据渠道,用于操作数据源(集合.数组等)所生成的元素序列. 集合讲的是数据,流讲的是计算 注意: Stream自己不会 ...

  7. Java8新特性-使用Stream流来实现递归遍历树形结构(案例)

    Java8新特性-Stream流 可能平常会遇到一些需求,比如构建菜单,构建树形结构,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中的Stream流一次性把数据查出来 ...

  8. Java8新特性:Stream详细使用

    目录 一.简介 二.创建Stream的常用方法 2.1 使用Stream中的静态方法:of().iterate().generate() 2.2 使用Collection下的 stream() 和 p ...

  9. java8新特性之Lambda流常用表达式的方法合集

    我们日常工作中,对于数据遍历.分组以及转换需要大量代码实现,借助java8新特性-LambdaLambda 流操作,几行代码可以帮助我们实现复杂代码,这里把 Lambda 流的常用方法用案列讲解一下. ...

最新文章

  1. 2018-3-19 损失函数与适应度函数,稳定选择与分裂选择
  2. python3进行汉字和unicode码的转换
  3. bat set命令详解
  4. 如何在Kubernetes上运行Apache Flink
  5. 手游开发者交流会议暨OGEngine新版发布
  6. U盘版便携式Linux制作, casper-rw 解析
  7. 洛谷 P1272 重建道路
  8. 为什么要用非关系数据库?
  9. 顺时针小球圆周运动Java编程_如何使用CSS实现圆周运动小球的实例
  10. tf.contrib.data.Dataset 读取数据的原理--buffer
  11. android imei *#06#,[Android]Hot key IMEI *#06# and *#07#
  12. 利用CSkin组件设计漂亮的WinForm登录界面
  13. ViBe算法source code
  14. 雷达初学者必读 | 毫米波雷达信号处理入门教程
  15. html 获取当前url,js获取当前页面url信息的方法
  16. 秘密行动倒计时丨DC86021行动指挥部致全体极客伙伴的一封密信
  17. mysql 临时表 会话级_会话级的临时表和事务级的临时表
  18. python加权求和_加权随机算法的python实现
  19. 学习 STM32之九轴姿态传感器(BWT901CL)串口通信读取数据
  20. HTML复选框,点击文字,对应的复选框选中

热门文章

  1. 像孙正义为了练英语坚决不说日语一样。我也应该有坚决不看中文文档的心!...
  2. 怎样选择宽带上网产品--解读上海电信政企宽带新套餐
  3. [转]cscope在windows下使用mingw编译的方法
  4. rabbitmq添加user及vhost
  5. 剖析 Vue.js 内部运行机制 (1)
  6. 电脑上查看端口是否被占用
  7. 数值优化:计算基本理论
  8. wttr.in -- a magical website
  9. Linux中buff-cache占用过高解决方案
  10. Spring内建可查找的依赖