转载

Scala模式匹配和Try

本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循 署名-非商业用途-保持一致 的创作共用协议.

2015年最后一天来一发.

从面向对象语言转来学习函数式语言, 疑惑还是非常多的..

  • 没有 return 关键字, 默认的最后执行结果返回
  • 迷一般的模式匹配
  • map(映射) 语法(虽然之前在Python中用过类似的)
  • 表达式和关键字区别是非常大的.
  • 还有至今不懂的 monad

模式匹配是数据结构中字符串的一种基本运算, 给定一个子串, 要求在某个字符串中找出与该子串相同的所有子串, 而在Scala中, 模式匹配可以认为针对各种数据结构进行匹配

比switch更强大

最开始我以为模式匹配用来替代其他语言中的Switch语句的, 后来我发现这个认识太浅薄了, 模式匹配远比Switch强大太多

  • 不需要明确的在每个逻辑最后追加 break , 默认是逻辑匹配后自动break
  • case _ 替代其他语言中的 default 语句.
  • match表达式可以匹配任意类型的变量
  • match不是语句而是 表达式 , 表达式本身是有返回值的!
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")  } 

捕获异常与Try

scala中的 try-catch 语句写起来和其他语言是差不多的, 其中异常的处理可以通过case进行具体的异常匹配,然后执行对应的逻辑

def tryCatch() = { try{ 1/0  } catch {  case e: ArithmeticException => println("分母为0")  } finally {  println("finally")  }  } 

try-catch 是面向对象语言的常用形式, 那么更加函数式的异常捕获呢? 使用Try

Try有两个子类型:

  1. Success[A] : 代表成功的计算
  2. 封装了 ThrowableFailure[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")  }  } 
原文  http://andrewliu.in/2016/02/07/Scala模式匹配和Try/
正文到此结束
Loading...