流 | 学习笔记

简介: 快速学习流

开发者学堂课程【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 操作后,会产生一个新的数据。

相关文章
|
Linux
44 # 流的原理
44 # 流的原理
71 0
java流是指在Java中用来读写数据的一组有序的数据序列,它可以将数据从一个地方带到另一个地方。java流分为输入流和输出流,输入流是从源读取数据的流,而输出流是将数据写入到目的地的流。Java流又可以分为字节流和字符流,字节流读取的最小单位是一个字节(1byte=8bit),而字符流一次可以读取一个字符(1char = 2byte = 16bit)。Java流还可以分为节点流和处理流,节点流是直接从一个源读写数据的流(这个流没有经过包装和修饰),处理流是在对节点流封装的基础上的一种流。
135 0
|
8月前
|
存储 C++ iOS开发
C++ 文件和流
C++ 文件和流
60 0
|
8月前
|
程序员 C++ iOS开发
c++文件和流
c++文件和流
44 0
|
8月前
|
Java
Stream流教程
Stream流教程
88 0
|
存储 缓存 Java
1.10 I/O流 最全 最全 最全整理
1.10 I/O流 最全 最全 最全整理
93 1
|
SQL JavaScript 前端开发
开始使用流
Java 8 中的 Stream 俗称为流,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念 Stream 用于对集合对象进行各种非常便利、高效的聚合操作,或者大批量数据操作 Stream API 借助于 Lambda 表达式,极大的提高编程效率和程序可读性 同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势 通过下面的例子我们可以初步体会到使用 Stream 处理集合的便利性
62 1
I/O流
IO流:I的全称是Input,O的全称是Output。表示读取,流可以看做是程序传输数据的通道。 作用:解决程序请求资源,输出资源的问题。
62 0
|
存储 Java
流及其相关操作
流及其相关操作