scala快速上手(六) Scala 迭代器模式+Trait 特质特性

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”重新定义。
  •  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("zhangsan")
		person.listen("lisi")
		println(person.listenType)
		println(person.readType)
		println(person.gender)
	}
}

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

object Lesson_Trait2 {
	def main(args: Array[String]): Unit = {
		val p1 = new Point(1,2)
		val p2 = new Point(1,3)
		println(p1.isEqule(p2))
		println(p1.isNotEqule(p2))
	}
}

trait Equle{
	def isEqule(x:Any) :Boolean
	def isNotEqule(x : Any) = {
		!isEqule(x)
	}
}

class Point(x:Int, y:Int) extends Equle {
	val xx = x
	val yy = y

	def isEqule(p:Any) = {
		p.isInstanceOf[Point] && p.asInstanceOf[Point].xx==xx
	}
}

 

你可能感兴趣的:(scala语言)