流 | 学习笔记

简介: 快速学习流

开发者学堂课程【Scala 核心编程 - 进阶学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/610/detail/9061



内容介绍:

一、流的基本介绍

二、流的简单运用

三、对流的小结


一、流的基本介绍

1.基本说明

流是数据,就像流水一样源源不断、无穷,是一个集合。也叫 Stream 。

Stream 这个集合,可以用于存放无穷多个元素,但是这无穷多个元素并不会一次性生产出来,当你需要的时候,才会产生一个你需要的数据,而且产生的数据是可以先规定一个规则的,这个规则类似于 lazy 规则,而是需要用到多大的区间,就会动态的生产,末尾元素遵循 lazy 规则(lazy 规则是加载或者惰性的,即:要使用结果才进行计算的)。

2.创建 Stream 对象

案例一:

def numsForm(n: BigIht) : Stream[BigIht] = n #:: numsForm(n+1)

val stream1 = numsForm(1)

其中 numsForm(n:BigIht) 中有一个 BigIht 函数,这个函数会产生一个Stream,并且 Stream 这个流对象里面存放了一个BigIht ,其产生的规则就是 n+1 ,一次增加一个,

详情可见如下说明:

(1)Stream 集合存放的数据类型是BigIht

(2) numsForm 是自定义的一个函数,函数名是程序员指定的。

(3)创建的集合的第一个元素是 n (即程序员先输入一个数据,于是创建的初始值就是这个数据),后续元素生成的规则是 n+1(这个规则可以由程序员自行进行变化,目的是为了让流在使用的时候自动的产生一个末尾的元素)

(4)后续元素生成的规则是可以程序员指定的,比如 numsForm( n * 4)...


二、流的简单运用

1.案例二

给出以下代码

使用 tall ,会动态的向 stream 集合按规则生成新的元素

//创建 Stream

def numsForm(n: BigIht) : Stream[Bight] = n #:: numsForm(n+1)

val stream1 = numsForm(1)

println(stream1)//

//取出第一个元素

println(“head=” + stream1.head)//

println(stream1.tail) //

println(stream1) //?

在这段程序中, numsForm(1)  表示第一次输入数据1,println(stream1)// 表示输出 stream 这个流,

而 stream1.head 表示取出这个流的第一个元素也就是 head ,再用 tail 取出尾部的元素,最后再输入流

注意:

如果使用流集合,就不能使用 last 属性(如果使用 last 集合会取最后一个元素,自动的触发函数),就会进行无限循环。

2.案例三

以下是命名为 StreamDemo01 类型为 object 的一段代码

package com.atguigu.chapter11

obiect StreamDeemo01 {

def main(args: Array[String]): Unit = {

//创建 Stream

def numsForm(n: BigIht) : Stream[BigIht] = n#:: numsForm(n+1)

val stream1 = numsForm(1)

println(stream1) //

//取出第一个元素

println(“head=” + stream1.head) //

printin(stream1.tail) //

println(stream1) //?

}

}

可以看到,流是一个集合,于是第一次产生的是 numsForm(1) 也就是1,后面产生的未输出,可以用...表示。

当取出第一个元素也就是1之后,而取 tail 取到尾部后会自动再次出发,此时会产生一个新的元素(根据 n+1 规则产生)也就是2,后面产生的同样可以用...表示。

运行此代码,可以看到结果,除...被?代替,其他与上述说明相同,且 stream1 输出的是1,2,?

3.案例四(应用案例)

使用 map 映射 stream 的元素并进行一些计算

//创建 Stream

def numsForm(n: BigIht) : Stream[BigIht] = n#:: numsForm(n+1)

def multi(x:BigInt) : BigInt = {

x * x

}

println(numsForm(5).map(multi)) //?

以上代码中增加了 def multi(x:BigInt) 以及 x * x 即 x 与 x 相乘,相乘后,由于产生的是一个集合,如果这个集合是多个,使用 map ,也会产生多个;如果这个集合是一个,那么只会产生一个。

numsForm(5) 表示产生了一个流,并且这个流只有一个元素5,而使用 map 对流进行了映射的操作,把流里面所有的数据也就是5取出来再乘以5后返回,产生25,后面产生的可以用 ?表示。

运行此代码,可以看到结果与以上说明大致相同。如果流的数据有多个,使用 map 会对流里面所有的数据进行 x * x 后返回的操作。


三、对代码的小结

1.对流的基本认识

流的主要作用是可以产生和存放无穷多个数据的一个集合,产生的集合中末尾元素遵循 lazy 规则(即需要才会产生,不需要不会产生)。

2.产生流对象的简单说明

创建流对象:通过四个案例进行了说明

其中:

(1)案例一的规则是 n+1 ,做测试大数据时可以用案例一的流来设计案例。

(2)案例二中使用了 tail ,使用 tail 才会产生新元素,如果不使用 tail 不会产生新元素,即当对流执行了 tail 操作后,会产生一个新的数据。

相关文章
|
运维 监控 数据库
如何实现软件SaaS化
如何实现软件SaaS化
|
SQL Oracle 关系型数据库
MySQL之如何将字符串分隔为列表结果集
MySQL之如何将字符串分隔为列表结果集
770 1
|
存储 监控 安全
【实战经验】记录项目开发常见的8个难题
风沙席地起,战马踏风归!
623 116
|
9月前
|
XML Java Maven
Spring 手动实现Spring底层机制
Spring 第六节 手动实现Spring底层机制 万字详解!
381 31
|
并行计算 关系型数据库 分布式数据库
朗坤智慧科技「LiEMS企业管理信息系统」通过PolarDB产品生态集成认证!
近日,朗坤智慧科技股份有限公司「LiEMS企业管理信息系统软件」通过PolarDB产品生态集成认证!
|
Linux 开发工具 索引
安装Windows和Linux双系统需要注意的一些问题
安装Windows和Linux双系统需要注意的一些问题
443 0
|
安全 网络虚拟化 数据安全/隐私保护
华为ensp模拟器 配置ACL访问控制列表
华为ensp模拟器,模拟配置acl访问规则,配置acl访问规则的详细解释和操作。
1252 0
华为ensp模拟器 配置ACL访问控制列表
|
开发框架 前端开发 Java
【Spring】Spring框架介绍,功能模块,容器知识和有关Spring的生态圈的详细讲解
【Spring】Spring框架介绍,功能模块,容器知识和有关Spring的生态圈的详细讲解
492 0
异步&线程池 CompletableFuture 异步编排 【下篇】
这篇文章深入探讨了Java中的`CompletableFuture`类,解释了如何创建异步操作、使用计算完成时的回调方法、异常处理、串行化方法、任务组合以及多任务组合的使用方式,并通过代码示例展示了各种场景下的应用。
异步&线程池 CompletableFuture 异步编排 【下篇】
|
安全 容灾 网络安全
阿里云高防
阿里云高防