java stream流_阿里面试官问我:Java8中创建Stream流有哪几种方式?

b24bd99bb854fbd4227ba4bf0d158df5.png

推荐观看:

马士兵直播:多线程与高并发实战训练营丨CPU层级实现丨基于源码底层讲解丨告别CRUD丨横扫一切关于多线程的问题丨吊打所有敢于提问并发问题的面试官。_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com
66722aeb3069c20ead5981530305a707.png
马士兵老师Java中级到高级面试题讲解丨面试必备丨Java开发工程师跳槽必备面试题丨大厂面试流程详解丨BATJ大厂跳槽指南_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com
aec1a5d046238627f46bb9110499bfcd.png
建议收藏丨马士兵亲授:JVM调优实战丨Jvm垃圾回收原理丨垃圾回收算法丨PB级大数据项目实战_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com
f2be62c5b10d0a1313e718cee7e2695a.png

写在前面

先说点题外话:不少读者工作几年后,仍然在使用Java7之前版本的方法,对于Java8版本的新特性,甚至是Java7的新特性几乎没有接触过。真心想对这些读者说:你真的需要了解下Java8甚至以后版本的新特性了。
今天,一名读者出去面试,面试官问他:说说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操作步骤

1.创建 Stream

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

2.中间操作

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

3.终止操作(终端操作)

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

dd75db7e51848b4628ba6b51b2c7d609.png

如何创建Stream流?

这里,创建测试类TestStreamAPI1,所有的操作都是在TestStreamAPI1类中完成的。

(1)通过Collection系列集合提供的stream()方法或者parallelStream()方法来创建Stream。

在Java8中,Collection 接口被扩展,提供了两个获取流的默认方法,如下所示。

default 

其中,stream()方法返回一个顺序流,parallelStream()方法返回一个并行流。

我们可以使用如下代码方式来创建顺序流和并行流。

List

(2)通过Arrays中的静态方法stream()获取数组流。

Java8 中的 Arrays类的静态方法 stream() 可以获取数组流 ,如下所示。

public 

上述代码的的作用为:传入一个泛型数组,返回这个泛型的Stream流。

除此之外,在Arrays类中还提供了stream()方法的如下重载形式。

public 

基本上能够满足基本将基本类型的数组转化为Stream流的操作。

我们可以通过下面的代码示例来使用Arrays类的stream()方法来创建Stream流。

Integer

(3)通过Stream类的静态方法of()获取数组流。

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

我们先来看看Stream的of()方法,如下所示。

public 

可以看到,在Stream类中,提供了两个of()方法,一个只需要传入一个泛型参数,一个需要传入一个可变泛型参数。

我们可以使用下面的代码示例来使用of方法创建一个Stream流。

Stream

(4)创建无限流

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

先来看看Stream类中iterate()方法和generate()方法的源码,如下所示。

public 

通过源码可以看出,iterate()方法主要是使用“迭代”的方式生成无限流,而generate()方法主要是使用“生成”的方式生成无限流。我们可以使用下面的代码示例来使用这两个方法生成Stream流。

  • 迭代
Stream

运行上述代码,会在终端一直输出偶数,这种操作会一直持续下去。如果我们只需要输出10个偶数,该如何操作呢?其实也很简单,使用Stream对象的limit方法进行限制就可以了,如下所示。

Stream
  • 生成
Stream

上述代码同样会一直输出随机数,如果我们只需要输出5个随机数,则只需要使用limit()方法进行限制即可。

Stream

(5)创建空流

在Stream类中提供了一个empty()方法,如下所示。

public 

我们可以使用Stream类的empty()方法来创建一个空Stream流,如下所示。

Stream

写在最后

如果觉得文章对你有点帮助,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习Java8新特性。

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

0d14025ac030c27894539b6c25d8a9ee.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值