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


    Scala迭代器模式处理数据

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

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

    迭代器模式处理示例:

    1. //非迭代器模式处理,浪费内存
    2. val list1 = List[String]("hello java","hello python","hello scala")
    3. val list2 = list1.flatMap(one=>{one.split(" ")})
    4. val list3 = list2.map(one=>{one+"#"})
    5. list3.foreach(println)
    6. println("***********************")
    7. //迭代器模式处理,内存小
    8. val list = List[String]("hello java","hello python","hello scala")
    9. val iter1 = list.iterator
    10. val iter2 = iter1.flatMap(one=>{one.split(" ")})
    11. val iter3 = iter2.map(one=>{one+"#"})
    12. while(iter3.hasNext){
    13. val one = iter3.next()
    14. println(one)
    15. }

    Trait 特质特性

    1、概念理解

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

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

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

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

    注意:

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

    2、trait中不可以传参数

    1. trait Read {
    2. val readType = "Read"
    3. val gender = "m"
    4. def read(name:String){
    5. println(name+" is reading")
    6. }
    7. }
    8. trait Listen {
    9. val listenType = "Listen"
    10. val gender = "m"
    11. def listen(name:String){
    12. println(name + " is listenning")
    13. }
    14. }
    15. class Person() extends Read with Listen {
    16. override val gender = "f"
    17. }
    18. object test {
    19. def main(args: Array[String]): Unit = {
    20. val person = new Person()
    21. person.read("lisi")
    22. person.listen("zhangsan")
    23. println(person.listenType)
    24. println(person.readType)
    25. println(person.gender)
    26. }
    27. }

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

    1. 1.object Lesson_Trait2 {
    2. 2. def main(args: Array[String]): Unit = {
    3. 3. val p1 = new Point(1,2)
    4. 4. val p2 = new Point(1,3)
    5. 5. println(p1.isEqule(p2))
    6. 6. println(p1.isNotEqule(p2))
    7. 7. }
    8. 8.}
    9. 9.
    10. 10.trait Equle{
    11. 11. def isEqule(x:Any) :Boolean
    12. 12. def isNotEqule(x : Any) = {
    13. 13. !isEqule(x)
    14. 14. }
    15. 15.}
    16. 16.
    17. 17.class Point(x:Int, y:Int) extends Equle {
    18. 18. val xx = x
    19. 19. val yy = y
    20. 20.
    21. 21. def isEqule(p:Any) = {
    22. 22. p.isInstanceOf[Point] && p.asInstanceOf[Point].xx==xx
    23. 23. }
    24. 24.
    25. 25.}

  • 相关阅读:
    cf edu #135 Div.2(A~C)
    自动化运维—ansible
    【腾讯云Cloud Studio 实战训练营】深入解析Cloud Studio—React 快速构建点餐页面
    踩坑实录:读写分离导致批量删除逻辑问题
    【大厂】进不了测试IT工程师们,我们的出路到底在何方?
    信息系统概述-生命周期-开发方法
    1455. 检查单词是否为句中其他单词的前缀
    KMP算法、计算器(一)、(二)
    Python面向对象丨面向过程和面向对象,你真的了解“对象”吗?
    Linux常见指令和基础知识
  • 原文地址:https://blog.csdn.net/yaya_jn/article/details/134414109