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)
-
- }
Scala Trait(特质) 相当于java的接口,实际上它比接口还功能强大。与接口不同的是,它还可以定义属性和方法的实现。
一般情况下Scala的类可以继承多个Trait,从结果来看就是实现了多重继承。第一个关键字使用extends,之后使用with。
Trait(特质)定义的方法与类类似,但它使用的关键字是trait。
2、举例:trait中带属性带方法实现
注意:
继承的多个trait中如果有同名的方法和属性,必须使用“override”重新定义。
- 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)
- }
-
- }
- 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.}