本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循 署名-非商业用途-保持一致 的创作共用协议.
2015年最后一天来一发.
从面向对象语言转来学习函数式语言, 疑惑还是非常多的..
return
关键字, 默认的最后执行结果返回 map(映射)
语法(虽然之前在Python中用过类似的) monad
模式匹配是数据结构中字符串的一种基本运算, 给定一个子串, 要求在某个字符串中找出与该子串相同的所有子串, 而在Scala中, 模式匹配可以认为针对各种数据结构进行匹配
最开始我以为模式匹配用来替代其他语言中的Switch语句的, 后来我发现这个认识太浅薄了, 模式匹配远比Switch强大太多
break
, 默认是逻辑匹配后自动break case _
替代其他语言中的 default
语句. 表达式
, 表达式本身是有返回值的!
deforiginMatch(name: String) = name match { case"Andrew"=>println("My name is $name") case"Andrewliu"=>println("He name is $name") case"Liu"=>println("helloworld") case_ =>println("Everything") }
scala中的 try-catch
语句写起来和其他语言是差不多的, 其中异常的处理可以通过case进行具体的异常匹配,然后执行对应的逻辑
def tryCatch() = { try{ 1/0 } catch { case e: ArithmeticException => println("分母为0") } finally { println("finally") } }
try-catch
是面向对象语言的常用形式, 那么更加函数式的异常捕获呢? 使用Try
Try有两个子类型:
Success[A]
: 代表成功的计算 Throwable
的 Failure[A]
, 代表出错的计算 如果当前处理逻辑可能导致异常, 可以简单使用 Try[A]
作为函数的返回类型
deftryMethod(name: String):Try[String] = { Try { println("My name is $name") throw new IOException("IOException") } match { case Success(result) => Try("hello world") case Failure(e) => println("hello world, This is a IOException"); Try("This is a Exception") } }
此处Success是当Try中逻辑正行执行时执行, 返回为Failure[String], Failure是在Try逻辑中出现异常时, 返回值编程了Failure[String]
在Python中使用isinstance来判断变量的类型, 而且必须要要记住对应的 type
, 每次都要查手册才行.
模式匹配来进行变量类型的匹配是极为感人的, 并且可以对匹配的变量进行重新命名, 简直感人.
defpatternMatch(para:Any): Unit = { para match { casei:Intifi <0=> i -1 casei:Int=> i +1 cased:Doubleifd <0.0=> d -0.1 cased:Double=> d +0.1 casetext: String => text +"s" case_ =>println("Any") } }