Scala---迭代器模式+Trait特质特性

Scala迭代器模式处理数据

scala中创建集合需要内存,集合与集合之间的转换时,每次转换生成新的集合时,新的集合也需要内存。如果有一个非常大的初始集合,需要经过多次转换,每次转换都生成一个新的集合,才能得到最终的结果,那么这时,在集合转换过程中内存开销非常大。Scala迭代器模式处理数据,很好的解决了内存占用大的问题。

Scala迭代器模式处理数据每次将集合的转换转变成了迭代器之间的转换,迭代器是不需要占用内存存储的,迭代器只是一个指针,指向了最初的原始数据,这样,数据处理过程中内存占用非常小。

迭代器模式处理示例:

复制代码
//非迭代器模式处理,浪费内存
val list1 = List[String]("hello java","hello python","hello scala")
val list2 = list1.flatMap(one=>{one.split(" ")})
val list3 = list2.map(one=>{one+"#"})
list3.foreach(println)

println("***********************")

//迭代器模式处理,内存小
val list = List[String]("hello java","hello python","hello scala")
val iter1 = list.iterator
val iter2 = iter1.flatMap(one=>{one.split(" ")})
val iter3 = iter2.map(one=>{one+"#"})
while(iter3.hasNext){
    val one = iter3.next()
    println(one)

}

Trait 特质特性

1、概念理解

Scala Trait(特质) 相当于java的接口,实际上它比接口还功能强大。与接口不同的是,它还可以定义属性和方法的实现。

一般情况下Scala的类可以继承多个Trait,从结果来看就是实现了多重继承。第一个关键字使用extends,之后使用with。

Trait(特质)定义的方法与类类似,但它使用的关键字是trait。

2、举例:trait中带属性带方法实现

注意:

继承的多个trait中如果有同名的方法和属性,必须使用"override"重新定义。

2、trait中不可以传参数

复制代码
trait Read {
    val readType = "Read"
    val gender = "m"
    def read(name:String){
        println(name+" is reading")
    }
}

trait Listen {
    val listenType = "Listen"
    val gender = "m"
    def listen(name:String){
        println(name + " is listenning")
    }
}

class Person() extends Read with Listen {
    override val gender = "f"
}

object test {
    def main(args: Array[String]): Unit = {
        val person = new Person()
        person.read("lisi")
        person.listen("zhangsan")
        println(person.listenType)
        println(person.readType)
        println(person.gender)
    }
    
}

3、举例:trait中带方法不实现

复制代码
1.object Lesson_Trait2 {
2.  def main(args: Array[String]): Unit = {
3.    val p1 = new Point(1,2)
4.    val p2 = new Point(1,3)
5.    println(p1.isEqule(p2))
6.    println(p1.isNotEqule(p2))
7.  }
8.}
9.
10.trait Equle{
11.  def isEqule(x:Any) :Boolean 
12.  def isNotEqule(x : Any) = {
13.     !isEqule(x)
14.  }
15.}
16.
17.class Point(x:Int, y:Int) extends Equle {
18.  val xx = x
19.  val yy = y
20.
21.  def isEqule(p:Any) = {
22.    p.isInstanceOf[Point] && p.asInstanceOf[Point].xx==xx
23.  }
24.
25.}
相关推荐
2501_941875285 小时前
从配置中心到动态管理的互联网工程语法演进与多语言实践分享
开发语言·python
hfywmsj6 小时前
广州餐饮铺位招租决策模型:多因子选址系统设计
开发语言·人工智能·python·广州餐饮铺位招租
努力的lpp8 小时前
php反序列化一(大白话版)
开发语言·web安全·php·ctf·反序列化
菜鸟~noob2338 小时前
【电子战】第03篇:CFAR(恒虚警)处理【含matlab代码】
开发语言·matlab
泡海椒9 小时前
内置SPI函数库详解:JQuick-Java Builtin工具类实战用法
java·开发语言·python
hqyjzsb9 小时前
零 AI 项目经验,学 Python 转型 AI 的正确顺序是什么?
开发语言·人工智能·python·算法·职场和发展·数据挖掘·数据分析
Keven_1110 小时前
算法札记:ACM适用的很骚的C++语法(持续更新)
开发语言·c++
脉动数据行情110 小时前
C# 实现德指 DAX 期货 WebSocket 实时行情监听
开发语言·websocket·c#
大圣编蚕11 小时前
Java ByteArrayInputStream 详解:从入门到实战
java·开发语言·算法
菜鸟~noob23311 小时前
【电子战】第02篇:能量检测器 vs. 相关检测器【含matlab代码】
开发语言·matlab