scala之高级使用总结

一.匹配模式

  • 概述
    • 类比于 java 中的 switch…case,但比其要强大、灵活很多。
    • 旨在解决符合一定模式(值也是模式的一种)情况下的匹配与处理问题。
  • 使用说明
    • 一个模式匹配包含了一系列备选项,每个都开始于关键字 case。 每个备选项都包含了一个模式及一到多个表达式。箭头符号**=>**隔 开了模式和表达式。
    • 选择器 match {备选项},match 表达式通过以代码编写的先后次序尝试每个模式来完成计算,只要发现有一个匹配的 case,剩下的 case 不会继续匹配。

示例
同类型

  def main(args: Array[String]) {
    println(selfMatch("javase"))
  }

  def selfMatch(x: String): String = x match {
    case "javase" => "Java 开发标准版"
    case "javaee" => "Java 开发企业版"
    case _ => "其它 Java 版本 "
  }

不同类型

  def main(args: Array[String]) {
    println(selfMatch("one"))
    println(selfMatch(2))
    println(selfMatch("III"))
    println(selfMatch("five"))
  }

  def selfMatch(x: Any): Any = x match {
    case "one" => 1
    case 2 => "two"
    case "III" => "希腊数字 3"
    case _ => "其它不认识了"
  }

复杂表达式匹配示例

  def main(args: Array[String]) {
    println(selfMatch(1))
    println(selfMatch(10))
    println(selfMatch(22))
    println(selfMatch(78))
  }

  def selfMatch(x: Int): String = x match {
    case _ if x < 12 => "幼年"
    case _ if x < 18 => "未成年"
    case _ if x >= 18 && x < 60 => "成年"
    case _ => "已步入老年了!"
  }

类型模式匹配示例

  def main(args: Array[String]) {
    println(selfMatch(1))
    println(selfMatch("10"))
    println(selfMatch(new TestPatternMatch()))
    println(selfMatch(new Object()))
  }

  def selfMatch(x: Any): Any = x match {
    case _: Int => "传入的是整型"
    case _: String => "传入的是字符串"
    case _: TestPatternMatch => "传入的数据类型是TestPatternMatch"
    case _ => "不知道什么类型"
  }
  //定义一个空类,便于上边的类型模式匹配
  class TestPatternMatch {

  }

二.正则表达式

  • 概述
    • 与 Java 当中的正则表达式的作用完全相同
    • 用"".r 或是 scala.util.matching 包中的 Regex 类实现对正则的支持抽象。
  • 常用方法
    • findAllIn:查找所有匹配结果
    • mkString:连接正则表达式匹配结果的字符串
    • 正则可以使用管道(|)来设置不同的模式

示例
   

//定义一个字符串作为正则表达式
    val pattern1 = "十八大".r
    //正则要去匹配的源字符串
    val str1 = "十八大是一个重要具有里程碑式的会议!"
    //在源串中查找第一个匹配 pattern 正则表达式的值
    println(pattern1 findFirstIn str1)//Some(十八大)


    //定义一个字符串作为正则表达式
    val pattern2 = new Regex("(十八|18)大")
    //正则要去匹配的源字符串
    val str2 = "十八大是一个重要具有里程碑式的会议,18 大以来社会各届取得了显著的进展和成果!"
    //在源串中查找所有匹配 pattern 正则表达式的值
    println((pattern2 findAllIn str2).mkString(","))

三.异常处理

  • 概述
    • 异常处理机制与 Java 语言相似,其异常类也采用了 Java 类,并没有重写
    • 主要包括异常抛出和异常捕获两大方面。
    • 抛出异常用 throw,声明可能的异常与 Java 不同,采用的注解式的@throws(classOf[SomeException])
    • 捕获异常,采用的 try…catch 的模式匹配的形式
    • Scala 里不需要捕获检查异常:checked exception,也不是必须把它们声明在 throws 子句中。 可以用@throws 标注声明一个 throws 子句,但这不是必需的 该机制最大的问题是如果遇到异常没有补捉,则程序会终止,如果进行了捕捉,可以按照程序设定的方式去进行,而不必须停止。

示例

//方法内抛出异常
def f(){
    throw new Exception("测试异常抛出!");
}
//方法定义时声明要抛出异常
@throws(classOf[Exception])
def callMe() = {
    println("i am in callMe method") 
}
//捕获异常
try {
  val f = new FileReader("input.txt")
} catch {
  case ex: FileNotFoundException => {
    println("不好意思,文件没有找到!")
  }
  case ex: IOException => {
    println("不明原因的 IO 异常!")
  }
} finally {
  println("无论 try...catch 如何,都会执行 finally,我在finally 中!")
}

四.提取器

  • 概述
    • 提取器是从传递给它的对象中提取出构造该对象的参数。
    • 提取器是一个带有 unapply 方法的对象。unapply 方法算是 apply方法的反向操作:unapply 接受一个对象,然后从对象中提取值,提取的值通常是用来构造该对象的值。
    • apply 与 unapply 方法是互反的,apply 用于构造一个对象,而不 需要用 new 方法是其重要特点,unapply 是反向解开这个对象,将其对应的参数值提取出来。

示例
 

 def main(args: Array[String]) {
    var obj = apply("antg", "192.168.1.33");
    println("Apply 方法形成一个对象: " + obj);
    println("Unapply 方法反向提取该对象中的参数:" +
      unapply(obj));
    println("Unapply 方法反向提取该对象中的参数: " +
      unapply("我不是一个登陆地址"));
  }

  // 注入方法 (可选)
  def apply(username: String, ip: String) = {
    username + "@" + ip
  }

  // 提取方法(必选)
  def unapply(str: String): Option[(String, String)] = {
    val parts = str split "@"
    if (parts.length == 2) {
      Some(parts(0), parts(1))
    } else {
      None
    }
  }

提取器与模式匹配

  def main(args: Array[String]) {
    //自动调用 TestUnapplyPatternMatch 的 apply 方法
    val loginInfo = TestFunction("antg", "192.168.1.33")
    println(loginInfo)
    loginInfo match {
      //unapply 被自动调用
      case TestFunction(username, ip) => println(username + "登陆了" + ip + " 这台机器!")
      case _ => println(loginInfo)
    }
  }

  def apply(username: String, ip: String) = username + "@" + ip

  def unapply(loginInfo: String): Option[(String, String)] = {
    val parts = loginInfo split "@"
    if (parts.length == 2) {
      Some(parts(0), parts(1))
    } else {
      None
    }
  }

五.文件IO

  • 概述
    • 与java的基本类似
    • 其文件写操作,直接用的都是 java 中 的 I/O 类
    • 增加了少部分新 IO 类,并对 API 中做了部分简化

示例
写字符串到指定文件中

  def main(args: Array[String]) {
    val writer = new FileOutputStream(new File("output.txt"))
    writer.write("antg".getBytes("utf-8"))
    writer.close()
    println("done") 
  }

从控制台读取用户输入

  def main(args: Array[String]) {
    print("想对现在的自己说的话: ")
    var line = "";
    //scala支持在代码块中引入包
    import scala.util.control.Breaks._
    var br = new BufferedReader(new InputStreamReader(System.in, "utf-8"))
    //要使用break的话必须使用breakable包起来
    breakable {
      line = br.readLine()
      while (line != null) {
        if (line equals "exit") {
          break
        }
        println(line)
        line = br.readLine()
      }
    }
    br.close()
    println("done")
  }

从文件中读取内容

def main(args: Array[String]) {
    println("读取文件内容为:")
    println("第一种方式---------")
    var fileSource = Source.fromFile("output.txt", "utf-8")
    for (line <- fileSource.getLines) {
      println(line)
    }
    println("第二种方式---------")
    Source.fromFile("output.txt", "utf-8").foreach {
      print _
    }
    println("第三种方式---------")
    fileSource = Source.fromFile("output.txt", "utf-8")
    fileSource.foreach(print)
  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mizui_i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值