开发者学堂课程【Scala 核心编程 - 进阶:视图(View)】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/610/detail/9062
视图(View)
内容介绍:
一、 View 的基本介绍
二、 View 的简单运用(通过案例体验 View 的用法)
三、对 View 的小结
一、View 的基本介绍
1.基本介绍
Stream 的懒加载特性,也可以对其他集合应用 view 方法来得到类似的效果,
具有如下特点:
(1) view 方法产出一个总是被懒执行的集合(即这个集合中的各种操作都是以懒加载的形式来进行处理)。
(2) view 不会缓存数据,每次都要重新计算,比如遍历 View 时。
二、 View 的简单运用(通过案例体验 View 的用法)
1.案例
请找到1-100中,数字倒序排列和它本身相同的所有数(1,2,11,22,33...)。
def multiple(num: Int): Int = {num}def eq(i: Int): Boolean = {i.toString.equals(i.toString.reverse)
}
//说明:没有使用 view
val viewSquares1 = (1 to 100)
.map(multiple)
.filter(eq)
println(viewSquares1)
//for (x <-viewSquares1){}
//使用 view
val viewSquares2 = (1 to 100)
.view
.map(multiple)
.filter(eq)
Println(viewSquares2)
首先 def eq(i: Int): Boolean 中运用了 eq ,
传进了一个 Boolean 用以进行过滤,即对1~100进行编译,然后再用 filter 对它们进行过滤,其中过滤的条件是传进 Int 之后,判断1~100中某个数字颠倒顺序过后是否和原来相同。
为了实现这个想法,这里使用了
{i.toString.equals(i.toString.reverse)} 这种方法, 先将 i 先转化成一个 String ,和它自己本身作对比,转换成 String 后再颠倒顺序看是否相等。
同时使用 .map(multiple) 做了一个映射,把元素 num 直接返回(这个操作并不是一定要做,这里可以不使用 map),然后使用 .filter(eq) 进行过滤,这样就可以得到需要的数据.
可以看到,这段代码使用了两种方法来完成“请找到1-100中,数字倒序排列和它本身相同的所有数”这个任务。
第一种是:
val viewSquares1 = (1 to 100)
.map(multiple)
.filter(eq)
这里没有使用 view ,直接使用了 map 。
第二种是:
val viewSquares2 = (1 to 100)
.view
.map(multiple)
.filter(eq)
这里使用了 view 。
创建一个名为 ViewDemo01 类型为 object 的文件夹,运行以下代码。
2.两种方法的区别。
(1)第一种:
object ViewDemo01 {
def main ( args : Array [ String ]): Unit = {
def multiple ( num : Int ): Int = {
num
}
//如果这个数,逆序后和原来数相等,就返回 true ,否则就返回false
def eq ( i : Int ): Boolean = {
i . toString . equals ( i . toString . reverse )
}
//说明:没有使用 view ,常规方式
val viewSquares1 = (1 to 100)
. map ( multiple )
. filter ( eq )
println (viewSquares1)
首先, multiple 函数相当于一个原封不动的返回(它没有很大的意义,可以删除),然后进行一个判断,即如果这个数,逆序后和原来数相等,就返回 true ,否则就返回false (因为这里有 equals ,本身就会返回真和假),再对1~100进行filter 过滤操作。这是不使用 view 的方法也是最常规的用法。
(2)第二种:
如果使用 view ,来完成这个问题,此时需求会发生改变,即不需要先产生1,2,11...这些数据,需要的时候再给出。于是可以在原本基础上加上 view ,即:
val viewSquares2 =(1 to 100).view.filter(eq)
println (viewSquares2)
运行后可以看到,返回的是一个 seqViewF ,这也是一个集合,但是它里面没有数据(虽然做了工作,但是它认为目前还没有使用到里面的数据,于是不会进行计算,等到它认为你等需要数据的时候才会给出),如果需要返回得到数据,需要遍历,
即加上:
For (item <- viewSquares2) {
Println(“item=”+item)
}
执行后可以看到结果与预期效果大致相同。
下面再做一个测试来探讨使用 filter 是否也能出发,filter 执行, eq也应该执行,如果执行了说明把数据缓存了,如果没有执行,说明 filter 没有出发。
执行后可以看到, eq 没有被调用。也就是说,当在程序中对集合进行 map ,filter,reduce,ford 等操作时,是不希望立即执行的,而是在使用到结果时才执行,则可以使用 view 来进行优化。
从以上两种方法的区别对比,也可以看出, view 这种方法对我们的计算的影响。
三、对 View 的小结
1.对 View 的基本介绍
2.应用案例