ScalaTour 2.函数
2016-05-13 10:37
232 查看
/** * 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") } }
相关文章推荐
- JavaScript重载函数实例剖析
- Qt之图形(QPainterPath)
- JVM参数设置、分析
- 2015 ETSI NFV用例指南
- 图解JSP运行原理和过程
- Qt之图形(QPainterPath)
- 无标题窗体的移动及其简单美化
- Linux设备驱动中得 DTS文件加载过程
- WEB前端开发优化技巧
- 获取assets目录文件解析数据存储数据库 Listview展示 Dialog删除修改从数据库获取数据
- php之路=html笔记1-26节资料分享·
- iOS开发——绘图电池按百分比显示
- git以及github冲突相关的问题
- MAC单用户
- python使用scrapy解析js示例
- SUNDIALS-CLN:An Arbitrary Precision Extension of the CVODE Library
- Nodejs expressjs 官网
- 创业失败的人后来都怎么样了?
- Java Map
- hdu4745——Two Rabbits(区间dp,最长回文子序列)