Scala学习整理[第二十二-二十三章 List和For循环]<Programming In Scala>

本文深入解析Scala中的List实现原理及For表达式的高级用法。通过对比List的高阶函数与For表达式的优缺点,展示了如何利用For表达式简化复杂的业务逻辑处理过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第二十二章 List的实现

/**
  * List的实现
  * 默认List -> scala.collection.immutable.List
  *
  * 本章解析了List的源码 ,在源码的内部使用了var while 循环 ,而非全部的val 递归
  * 因为循环的效率是大于等于递归的
  * scala的"函数化"编程其实是  '通过合理的封装,使得开发流程是函数化的' ,这样会使得业务代码非常清晰
  *
  * 而外部(相对于List等工具类的源码来说)使用val
  * 提高重复使用率(指向内存堆中同一个数据结构)的同时 ,保证数据不会轻易改变(共享状态下会影响多处)
  * "设计者同样希望维持纯粹.不可变的数据结构 ;也都希望能够高效.渐进式的构造这个数据结构"
  */

第二十三章

package SecondWithProgrammingInScala

/**
  * 重访For表达式
  */

case class Person(name: String, isMale: Boolean, children: Person*)

object ForApplication {

  val lara = Person("Lara", false)
  val bob = Person("Bob", true)
  val julie = Person("Julie", false, lara, bob)
  val persons = List(lara, bob, julie)

  def main(args: Array[String]): Unit = {
    /**
      * map方法 : 对每一个子元素执行方法 ,并将返回值记录生成一个Seq(some) ,最后返回一个大的Seq( Seq(some1)...Seq(somen) )
      * flatMap方法 : 类似map ,将返回值记录到同一个Seq(some) ,最后返回Seq(some1...somen)
      */

    //List的高阶函数
    persons
      .filter(p => !p.isMale)
      .flatMap(p => (
        p.children.map(c => (p.name, c.name))
        )
      )

    /**
      * scala的for循环有着更多的结构和功能 ,可以完成递归/查询/过滤等操作
      * p <- persons 生成式
      * if !p.isMale 过滤式
      * name = p.name 定义式
      * yield 保留字
      *
      */

    //for循环
    for (p <- persons if !p.isMale;
         c <- p.children)
      yield (p.name, c.name)
  }

  /**
    * 在一些时候 ,我们提倡多使用List的高阶函数 ,map/filter等 ,他们看起来更直观
    * 但面对一些复杂操作时 ,他们的使用关系也可能变得复杂 ,并不利于阅读
    * 例如 : 找出所有母子的姓名对
    *
    * 这时候就可以使用for-if-yield方法
    * 实质上 ,scala会把
    * 带有yield的编译成filter/flatMap/map方法组合
    * 不带yield的编译成filter/foreach方法组合
    *
    * 转义生成器
    * for(x<-expr1) yield expr2
    *         expr1.map(x=>expr2)
    *
    * 转义过滤
    * for(x<-expr1 if expr2) yield expr3
    *         for(x<-expr1 filter(x=>expr2)) yield expr3
    *         expr1 filter(x=>expr2) map(x=>expr3)
    *
    * 转义两个生成器
    * for(x<-expr1 ;y<-expr2) yield expr3
    *         expr1 flatMap( x=> for(x<-expr2) yield expr3 )
    *         expr1 flatMap( x=> expr2.map(x=>expr3) )
    *
    * 转义生成器中的模式
    * for((x,y) <- expr1 ) yield expr2
    *         expr1 map( case (x,y) => expr2)
    *
    * for("pat" <- expr1 ) yield expr2
    *         expr1 filter(
    *           case "pat" => true
    *           case _ => false
    *         ) map( case (x,y) => expr2)
    *
    * 转义定义
    * for(x<-expr1 ; y=expr2) yield expr3
    *         for( (x,y)<-  for(x<-expr1) yield (x,expr2)) yield expr3
    *
    * 转义循环
    * for(x<-expr1) body
    *   expr1 foreach (x => body)
    */
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值