模式匹配常见应用形态

参考文献
scala 深入浅出实战经典 . 王家林
场景
赋值语句、for循环与提取器下的模式匹配实战
实验

package com.scode.scala
import scala.Range
/**
 * author: Ivy Peng
 * function: 模式匹配实战
 * date:2016/04/1 7:00
 * 
 * 赋值语句、for循环与提取器下的模式匹配
 */

/*
 * 提取器:提取 List中 最后一个,与其他所有剩余元素
 */
object :>
{
  def unapply[A](list:List[A])= //<span style="color:#ff0000;">这里,"=" 是必须的,否则第 21行编译时报错 "</span>an unapply result must have a member `def isEmpty: Boolean" 。这里有//待后续进一步理解
  {
    Some((list.init,list.last))
  }
}

object ForEnhancer
{
  def main(args: Array[String]): Unit =
  {
     patter_match_assigment
     patter_match_for
     patter_abstractor
  }
  
  /**
   * 赋值语句与模式匹配
   */
  def patter_match_assigment
  {
     val a@b = 1000
    println("a="+a +"b=" +b)
    val (c,d)=(1000,2000)
//    val (e,D)=(1000,2000) D为编译器看做常量
    val Array(g,h) = Array(19,2)
    
    object Test{val 1=1}
    object Test2{val 2=1} // lazy级别的->编译时不会报错,运行时报错
  }
  
  /**
   * for循环与模式匹配
   */
  def patter_match_for
  {
    for(i<- List(1,2,4,4)){println _ }
    
    //给变量index一个别名
    for(index@"Flink" <- List("Hadoop","Spark","Flink")) {print(index + " ")}
     
    //过滤第二个元素是 Hadoop字符串的元组
    for((language,"Hadoop") <- Set("scala"->"Spark","java"->"Hadoop")){println(language)}
    
    //过滤第二个元素为整数的元组 
    for((k,v:Int)<- List(("Spark"->5),("Hadoop"->6),("Flink"-> "Nice"))) println(v)
  }
  
  /**
   * 提取器与模式匹配
   * 1、"_"可以表示一个元素:一个字符,或者一个集合等
   * 2、提取器语法: Value 提取器 Value 或者 提取器(Value,Value)
   */
  def patter_abstractor
  {
     (1 to 9) toList match{ case _:>9 => println("Hadoop")}
     (1 to 9) toList match{ case :>(_,9) => println("Hello,World !")}
     
     Range(1,10) toList match{ case _ :> 8 :> 9 => println("Spark")}
     (1 to 9) toList match {case :>(:>(_,8),9)=> println("Flink")}
  }
}

执行结果

a=1000 b=1000
Flink java
5
6
Hadoop
Hello,World !
Spark
Flink


你可能感兴趣的:(模式匹配常见应用形态)