ScalaTour 2.函数
2024-10-19 02:21:50
/**
* 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")
}
}
最新文章
- 从客户端(?)中检测到有潜在危险的 Request.Path 值 的解决方案
- NOIP2013 花匠
- sublime Text2 2.0.2 build 2221 64位 破解(已测试)
- 企业应用架构模式阅读笔记 - Martin Fowler
- glog使用
- web前端之 HTML标签详细介绍
- python运维开发(十六)----Dom&;&;jQuery
- [pip]upgrade outdated pip package on windows / 在windows上更新所有过时的pip包
- IIS中报错弹出调试,系统日志-错误应用程序名称: w3wp.exe,版本: 8.5.9600.16384,时间戳: 0x5215df96(360主机卫士)
- windows服务器nginx+php启动开源ecshop
- 弹出层-layui
- P3378 堆の模板
- CentOS6.5升级GCC4.8
- System.Web.HttpException (0x80004005): 验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <;machineKey>; 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate。
- Strom的trident小例子
- 冲刺Two之站立会议2
- java AES加密、解密(兼容windows和linux)
- vue之生命周期的一点总结
- 前端中this的用法
- go加密算法:非对称加密(二)--Hash
热门文章
- Codeforces Round #190 (Div. 2) B. Ciel and Flowers
- C专家编程学习 1
- 转:Struts标签checkbox使用总结(默认选择设置)
- TCP通讯程序设计---5
- activiti工作流数据库表详细介绍 (23张表)
- ✡ leetcode 156. Binary Tree Upside Down 旋转树 --------- java
- [HAOI2012]音量调节
- IOS中如何获取手机的当前IP
- Git-rebase与merge小结
- EDIUS分别输出视频和音频的教程