ScalaTour 2.函数

/**
  * 1. case class与模式匹配
  */
object TestFunction extends App{
  def value(expr:Expr): Int = expr match {
    case FibonaciExpr(0) => 0
    case FibonaciExpr(1) => 1
    case FibonaciExpr(n) => value(SumExpr(FibonaciExpr(n-1),FibonaciExpr(n-2)))
    case SumExpr(a,b) => value(a) + value(b)
    case _ => 0
  }

  println(value(FibonaciExpr(3)))
}

abstract class Expr
case class FibonaciExpr(n:Int) extends Expr{
  require(n >= 0)   //PreDef中的方法,用于参数校验
}

case class SumExpr(a:Expr,b:Expr) extends Expr


/**
  * 2. scala中函数对代码的简化
  */
object TestFun2 extends App{
  val list = List(1,2,3,4,5,6)
  println("list包含基数吗:"+list.exists(_ %2 ==1 ))

  val fileName = List("warn 2013 msg", "warn 2012 msg","error 2013 msg", "warn 2013 msgs")
  println("cat file | grep 'warn' | grep '2013' | wc : "+fileName.filter(_.contains("warn")).filter(_.contains("2013")))
}

/**
  * 3. scala的wordcount
  */
object TestWordCount extends App{
  val file = List("warn 2013 msg", "warn 2012 msg","error 2013 msg", "warn 2013 msg")
  def countInStr(str:String):Int = str.split(" ").count("msg"==_)
  val num = file.map(countInStr).reduceLeft(_ + _)
  println(num)
}

/**
  * 4. 尾递归 : 函数的最后一步返回函数本身,没有其他的操作
  * foldLeft的尾递归实现
  */
object TestTailRec extends App{
  val file = List("warn 2013 msg", "warn 2012 msg","msg 2013 msg", "warn 2013 msg")
  def countInStr(str:String):Int = str.split(" ").count("msg"==_)
  println(file.map(countInStr))  //List(1, 1, 2, 1)
  def foldLeft(list:List[Int])(init:Int)(f:(Int,Int) =>Int) :Int = {
    list match {
      case List() => init
      case head::tail => foldLeft(tail)(f(head,init))(f)
    }
  }
  println(foldLeft(file.map(countInStr))(0)(_+_))  // 1+1+2+1 = 5 [科里化]
}

/**
  * 5. 生成List的for循环
  */
object TestFor2List extends App{
  val file = List("warn 2013 msg", "warn 2012 msg","msg 2013 msg", "warn 2013 msg")
  def countInStr(str:String):Int = str.split(" ").count("msg"==_)
  val counts = for(str <- file) yield countInStr(str)
  val num = counts.reduceLeft(_+_)
  println(num)
}

/**
  * 6. Option类型
  */
object TestOption extends App{
  def getProperty(param:String): Option[String] ={
    val value = System.getProperty(param)
    value match {
      case null => None
      case _ => Some(value)
    }
  }

  val osName = getProperty("os.name")

  println(osName.getOrElse("none"))      //1. Option类型的getOrElse方法
  osName.foreach(println(_))             // 2. Some类型的值可以作为长度为1的List处理
  osName match {                         //3. Option支持类型匹配
    case Some(value) => println(value)
    case _ => println("null")
  }
}

posted @ 2016-05-13 10:37  lj72808up  阅读(116)  评论(0编辑  收藏  举报