• 中美研究人员发现新型狗流感病毒 2019-05-29
  • 豫园商城升级改造:这些楼顶可见最好的风景--旅游频道 2019-05-14
  • 头条 —频道 春城壹网 七彩云南 一网天下 2019-05-14
  • 人为某种意识而奋斗是幸福的,获得成绩或成就更幸福。 2019-05-10
  • 【专题】省违反中央八项规定精神和“四风”问题线索举报平台 2019-05-09
  • 确定这是热身赛?吴前拼到大腿抽筋 拆绷带继续干 2019-05-09
  • 应对排放新规 大众德国工厂计划短暂停产 2019-04-26
  • 一师一团土地确权登记颁证工作全面展开 2019-04-26
  • 一语惊坛(5月31日):“我们不一样”,中国向世界许下一个承诺。 2019-04-22
  • 俄罗斯世界杯F组:球迷风采 2019-04-10
  • 5月份国民经济数据发布:中国经济持续稳中向好 2019-04-10
  • 贵州宣讲十九大:干部争当宣讲员 群众心窝暖洋洋 2019-03-25
  • 别空谈,说说看,这个“简单的逻辑关系”是什么关系? 2019-03-25
  • 快过闪电,MIUI 10与MIUI 9速度对比 2019-03-21
  • 泽州去年“免费教育”资金达5211万元 2019-03-19
  • java/Java Pyton 大数据 Hadoop Spark

    scala模式匹配详细解析

    一.scala模式匹配(pattern matching)

    快乐彩开奖号码 www.752o.com pattern matching可以说是scala中十分强大的一个语言特性,当然这不是scala独有的,但这不妨碍它成为scala的语言的一大利器。

    scala的pattern matching是类似这样的,

    e match {
      case Pattern1 => do Something
      case Pattern2 if-clause => do others
      ...
    }

    其中,变量e后面接一个match以及一个代码块,其中每个case对应一种可能回匹配的类型,如果匹配成功则执行=>后面的代码。

    我们可以用一个具体一些的例子来看看模式匹配是怎么工作的:

    case class Player(name: String, score: Int)
    def printMessage(player: Player) = player match {
      case Player(_, score) if score > 100000 =>
        println("Get a job, dude!")
      case Player(name, _) =>
        println("Hey, $name, nice to see you again!")
    }

    看起来有点类似于其他语言的switch,但其实还是有很大的不同的。

    以java的switch为例,java的switch仅仅会做一些基本类型的匹配,然后执行一些动作,并且是没有返回值的。

    而scala的pattern matching match则要强大得多,除了可以匹配数值,同时它还能匹配类型。

    def parseArgument(arg: String) = arg match {
        //匹配值
        case "-h" | "--help" => displayHelp
        case "-v" | "--version" => displayVerion
        case whatever => unknownArgument(whatever)
    }
    def f(x: Any): String = x match {
        //匹配类型
        case i:Int => "integer: " + i
        case _:Double => "a double"
        case s:String => "I want to say " + s
    }
    

    同时pattern matching是有返回值的,比如上面的match,它返回的就是一个Unit。我们也可以修改上面的代码让它返回一个字符串:

    case class Player(name: String, score: Int)
    def message(player: Player) = player match {
      case Player(_, score) if score > 100000 =>
        "Get a job, dude!"
      case Player(name, _) =>
        "Hey, $name, nice to see you again!"
    }

    值得一提的是,pattern matching 返回值是由第一个匹配的模式中的代码块决定的。

    二. 为什么要用pattern matching

    看到这里你会发现一个问题,pattern matching不是和if else差不多吗?那为什么还要使用pattern matching呢?

    首先我们需要明白,模式匹配其实本质上是提供一个方便的解构(Destructuring)数据结构的方式,以scala为例,pattern matching其实用到了scala中提取器的功能,提取器其实就是类中的unapply()方法。

    trait User {
      def name: String
    }
    class FreeUser(val name: String) extends User
    object FreeUser {
      //提取器
      def unapply(user: FreeUser): Option[String] = Some(user.name)
    }
      val user: User = new FreeUser("Daniel")
      user match {
        case FreeUser(name) => println("it match here" + name)
        case _ => println("not me")
      }

    明白了模式匹配的本质你就会直到,其实if else只是pattern matching中的一个典型的用法,但并非它的全部。

    同时,pattern matching允许你解耦两个并不真正属于彼此的东西,也使得你的代码更易于测试。比如上面的match部分的代码我们可以写成下面这样:

      val user: User = new FreeUser("Daniel")
      //将返回结果存在一个常量中
      val message = user match {
        case FreeUser(name) => "it match here" + name
        case _ => "not me"
      }
      //可以随意使用该常量,实现解耦
      println(message)

    这样会赋予代码更多的灵活性,同时也更加方便做进一步操作。

    而以可读性的角度来说,使用一大堆的if else代码无疑是比较难看的,而如果使用pattern matching的话,代码会简洁清晰很多,而简洁的代码则会更容易阅读。

    参考文章:

    https://doc.yonyoucloud.com/doc/guides-to-scala-book/chp3-pattern-everywhere.html

    https://www.zhihu.com/question/30354775


    推荐阅读:
    从分治算法到 MapReduce
    大数据存储的进化史 --从 RAID 到 Hdfs

    posted @ 2018-11-15 10:41 zzzzMing 阅读(...) 评论(...) 编辑 收藏
  • 中美研究人员发现新型狗流感病毒 2019-05-29
  • 豫园商城升级改造:这些楼顶可见最好的风景--旅游频道 2019-05-14
  • 头条 —频道 春城壹网 七彩云南 一网天下 2019-05-14
  • 人为某种意识而奋斗是幸福的,获得成绩或成就更幸福。 2019-05-10
  • 【专题】省违反中央八项规定精神和“四风”问题线索举报平台 2019-05-09
  • 确定这是热身赛?吴前拼到大腿抽筋 拆绷带继续干 2019-05-09
  • 应对排放新规 大众德国工厂计划短暂停产 2019-04-26
  • 一师一团土地确权登记颁证工作全面展开 2019-04-26
  • 一语惊坛(5月31日):“我们不一样”,中国向世界许下一个承诺。 2019-04-22
  • 俄罗斯世界杯F组:球迷风采 2019-04-10
  • 5月份国民经济数据发布:中国经济持续稳中向好 2019-04-10
  • 贵州宣讲十九大:干部争当宣讲员 群众心窝暖洋洋 2019-03-25
  • 别空谈,说说看,这个“简单的逻辑关系”是什么关系? 2019-03-25
  • 快过闪电,MIUI 10与MIUI 9速度对比 2019-03-21
  • 泽州去年“免费教育”资金达5211万元 2019-03-19
  • 龙虎网 排列三走势图选号视频 dnf解除安全模式 北京赛车骗局真相网站 时时乐开奖走势图 今天玩冰球突破输了2万 pt古怪猴子技巧 快乐扑克3官网 3d开奖直播视频 福建31选7几点开奖直播 钻石锁子甲 我的世界怎么骑马 时时彩缩水网页版 福建彩票36选7走势图 云南快乐10分开将结果 球球大作战神奇中吐教学