当前位置:   article > 正文

Scala Extention

Scala Extention

正则

  1. import scala.util.matching.Regex
  2. import scala.util.matching.Regex.Match
  3. /*
  4. ----------------------------------------------------------
  5. 匹配
  6. */
  7. val rtr = "^(\\w+)@([a-z0-9]{2,})\\.(com|cn|edu|org)$";
  8. val regex:Regex = rtr.r
  9. // 同 Java 的简单匹配
  10. val bool: Boolean = "12665473@qq.com".matches(rtr)
  11. /*
  12. ----------------------------------------------------------
  13. 查找:模式匹配,对象提取:【元组,样例类】
  14. */
  15. val tp3: (String, String, String) = "12665473@q.com" match {
  16. case regex(g1, g2, g3) => (g1, g2, g3)
  17. case _ => ("INVALID", "INVALID", "INVALID")
  18. }
  19. /*
  20. ----------------------------------------------------------
  21. 替换
  22. */
  23. val rtr = "(8\\d+)"
  24. val regex:Regex = rtr.r
  25. val content = "java:88,mysql:80,scala:69,spark:75"
  26. val replace1: String = regex.replaceFirstIn(content, "99")
  27. // 参二为函数 f:Matcher=>Option[String]
  28. val replace2: String = regex.replaceSomeIn(content, m => Some((m.group(1).toInt+10).toString))
  29. val replace3: String = regex.replaceAllIn(content, "99")
  30. // 参二为函数 f:Matcher=>String
  31. val replace4: String = regex.replaceAllIn(content, m => (m.group(1).toInt+10).toString))
  32. /*
  33. ----------------------------------------------------------
  34. 分组:必须添加 ()
  35. */
  36. val regexPart = "\\d+".r
  37. val cont = "112,334,453,229,4567"
  38. val name: Option[String] = regexPart.findFirstIn(cont) // Some(112)
  39. val it: Regex.MatchIterator = regexPart.findAllIn(cont) // 112 334 453 229 4567
  40. Regex.Match match = regexXxx.findXxxMatchInt(content:String)
  41. val groupContent = match.group(id:Int)
  42. val rtr = "(\\w+):(\\d+)"
  43. val regex:Regex = rtr.r
  44. val content = "java:88,mysql:80,scala:69,spark:75"
  45. val name: Regex.Match = regexPart.findFirstMatchIn(cont)
  46. val matches: Iterator[Regex.Match] = regex.findAllMatchIn(content)
  47. matches.foreach(m=>println(s"${m.group(1)} => ${m.group(2)}"))
  48. /*
  49. 练习一:使用正则表达式解析日志
  50. 现有如下日志信息,请使用Scala正则表达式解析如下信息
  51. 日志级别
  52. 日期
  53. 请求URI
  54. INFO 2016-07-25 requestURI:/c?app=0&p=1&did=18005472&industry=469&adid=31
  55. INFO 2016-07-26 requestURI:/c?app=0&p=2&did=18005473&industry=472&adid=31
  56. INFO 2016-07-27 requestURI:/c?app=0&p=1&did=18005474&industry=488&adid=32
  57. */

隐式类

  1. /*
  2. 隐式转换
  3. 隐式参数:隐式传入
  4. 场景:多个函数共享同一个参数,选择柯里化,将最后一个列表设计为该共享参数的唯一参数,并将
  5. 该参数设置为 implicit
  6. implicit order:Ordering[Int] = Ordering.Int.reverse
  7. val sorted = Array(8,1,3,2,5).sorted(implicit order:Ording[Int])
  8. 隐式函数:隐式类型转换
  9. implicit def strToInt(str:String) = str.toInt
  10. val a:Int = "12"
  11. 隐式类:扩展
  12. 用implicit关键字修饰的类,扩展其主构造器唯一参数类型的功能
  13. 只能在类、Trait、对象(单例对象、包对象)内部定义
  14. 构造器只能携带一个非隐式参数
  15. 隐式类不能是 case class
  16. 在同一作用域内,不能有任何方法、成员或对象与隐式类同名
  17. 隐式类必须有主构造器且只有一个参数
  18. */
  19. // 字符串的方法扩展,而在 Java 中 String 是final的,无法扩展
  20. implicit class StrExt(str:String){
  21. def incr() = str.map(c=>(c+1).toChar)
  22. def isEmail = str.matches("\\w+@[a-z0-9]{2,10}\\.(com(.cn)?|cn|edu|org)")
  23. }
  24. val a:String = "12665473@qq.com"
  25. val incr: String = a.incr
  26. val isEmail: Boolean = a.isEmail

异常处理 

  1. /*
  2. Exception : compiling : try...catch...
  3. RuntimeTime : running : 用程序逻辑(分支结构)
  4. 外部资源:释放 finally : try(resource extends AutoClosable)
  5. void close() throws Exception;
  6. */
  7. try(
  8. // 此处声明并初始化的 AutoCloseable 资源会在使用完自动释放
  9. ){
  10. // 代码块(非异常代码不放)
  11. }catch(Exception ex){
  12. // 异常的捕获和处理
  13. }
  14. try{
  15. // 代码块(非异常代码不放)
  16. }catch(Exception ex){
  17. // 异常的捕获和处理
  18. }finally {
  19. // 释放资源
  20. }
  21. // 同 Java
  22. def divideThrow(a:Int,b:Int) = {
  23. if(b==0){
  24. throw new Exception("divide by zero")
  25. }
  26. a/b
  27. }
  28. // 同 Java + Optional
  29. def divideTry(a:Int,b:Int):Option[Int] = {
  30. try{
  31. Some(a/b)
  32. }catch {
  33. case e:ArithmeticException => None
  34. }
  35. }
  36. // scala 特有 Either[Left异常,Right正常]
  37. def divideEither(a:Int,b:Int): Either[String,Int] = {
  38. try{
  39. Right(a/b)
  40. }catch {
  41. case e:ArithmeticException => Left("divide by zero")
  42. }
  43. }
  44. // 案例
  45. val e: Either[String, Int] = divideEither(1, 2)
  46. val v = if(e.isLeft) e.left else e.right
  47. // 【推荐】
  48. import scala.util.control.Exception.{allCatch,failAsValue}
  49. // Option[V] => Some(V) : None
  50. // V v = if(opt.isEmpty) defaultValue else opt.get
  51. def divideOpt(a:Int,b:Int) = {
  52. allCatch.opt(a/b)
  53. }
  54. // Try[V] => Success(V) : Failure(Throwable)
  55. def divideWithTry(a:Int,b:Int) = {
  56. allCatch.withTry(a/b)
  57. }
  58. // Either[Throwable,V] => Right(V) : Left(Throwable)
  59. def divideEither(a:Int,b:Int) = {
  60. allCatch.either(a/b)
  61. }
  62. // 【推荐】参数1:异常类型,参数2:异常发生返回的值,参数3:正常返回的值
  63. def divideFail(a:Int,b:Int) = {
  64. failAsValue(classOf[ArithmeticException])(-1)(a/b)
  65. }

类型信息处理

  1. case class Text(author:String,title:String,price:Float)
  2. class TextSon(level:String,
  3. override val author:String,
  4. override val title:String,
  5. override val price:Float)
  6. extends Text(author, title, price)
  7. {
  8. val _level:String = level
  9. override def toString() = s"TextSon{${super.toString}, ${_level}}"
  10. }
  11. // 提取类型信息
  12. val ci: Class[Text] = classOf[Text]
  13. val obj:Text = new TextSon("TOP","The Wild Roaring","张培元",86.32f)
  14. // 类型判断
  15. val isIns: Boolean = obj.isInstanceOf[TextSon]
  16. // 类型转换:转换不当会导致 ClassCastException
  17. val son: TextSon = obj.asInstanceOf[TextSon]
  18. val son: Option[TextSon] = allCatch.opt(obj.asInstanceOf[TextSon])

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/499202
推荐阅读
相关标签
  

闽ICP备14008679号