Scala Extention

2024-04-24 19:36
文章标签 scala extention

本文主要是介绍Scala Extention,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

正则

import scala.util.matching.Regex
import scala.util.matching.Regex.Match/*----------------------------------------------------------匹配
*/
val rtr = "^(\\w+)@([a-z0-9]{2,})\\.(com|cn|edu|org)$";
val regex:Regex = rtr.r
// 同 Java 的简单匹配
val bool: Boolean = "12665473@qq.com".matches(rtr)/*----------------------------------------------------------查找:模式匹配,对象提取:【元组,样例类】
*/
val tp3: (String, String, String) = "12665473@q.com" match {case regex(g1, g2, g3) => (g1, g2, g3)case _ => ("INVALID", "INVALID", "INVALID")
}/*----------------------------------------------------------替换
*/
val rtr = "(8\\d+)"
val regex:Regex = rtr.r
val content = "java:88,mysql:80,scala:69,spark:75"
val replace1: String = regex.replaceFirstIn(content, "99")
// 参二为函数 f:Matcher=>Option[String]
val replace2: String = regex.replaceSomeIn(content, m => Some((m.group(1).toInt+10).toString))
val replace3: String = regex.replaceAllIn(content, "99")
// 参二为函数 f:Matcher=>String
val replace4: String = regex.replaceAllIn(content, m => (m.group(1).toInt+10).toString))/*----------------------------------------------------------分组:必须添加 ()
*/
val regexPart = "\\d+".r
val cont = "112,334,453,229,4567"
val name: Option[String] = regexPart.findFirstIn(cont)	// Some(112)
val it: Regex.MatchIterator = regexPart.findAllIn(cont) // 112 334 453 229 4567Regex.Match match = regexXxx.findXxxMatchInt(content:String)
val groupContent = match.group(id:Int)val rtr = "(\\w+):(\\d+)"
val regex:Regex = rtr.r
val content = "java:88,mysql:80,scala:69,spark:75"
val name: Regex.Match = regexPart.findFirstMatchIn(cont)
val matches: Iterator[Regex.Match] = regex.findAllMatchIn(content)
matches.foreach(m=>println(s"${m.group(1)} => ${m.group(2)}"))/*练习一:使用正则表达式解析日志现有如下日志信息,请使用Scala正则表达式解析如下信息日志级别日期请求URIINFO 2016-07-25 requestURI:/c?app=0&p=1&did=18005472&industry=469&adid=31INFO 2016-07-26 requestURI:/c?app=0&p=2&did=18005473&industry=472&adid=31INFO 2016-07-27 requestURI:/c?app=0&p=1&did=18005474&industry=488&adid=32
*/

隐式类

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

异常处理 

/*Exception : compiling : try...catch...RuntimeTime : running : 用程序逻辑(分支结构)外部资源:释放 finally : try(resource extends AutoClosable)void close() throws Exception;
*/
try(// 此处声明并初始化的 AutoCloseable 资源会在使用完自动释放  
){// 代码块(非异常代码不放)
}catch(Exception ex){// 异常的捕获和处理
}try{// 代码块(非异常代码不放)
}catch(Exception ex){// 异常的捕获和处理
}finally {// 释放资源
}// 同 Java
def divideThrow(a:Int,b:Int) = {if(b==0){throw new Exception("divide by zero")}a/b
}// 同 Java + Optional
def divideTry(a:Int,b:Int):Option[Int] = {try{Some(a/b)}catch {case e:ArithmeticException => None}
}// scala 特有 Either[Left异常,Right正常]
def divideEither(a:Int,b:Int): Either[String,Int] = {try{Right(a/b)}catch {case e:ArithmeticException => Left("divide by zero")}
}// 案例
val e: Either[String, Int] = divideEither(1, 2)
val v = if(e.isLeft) e.left else e.right// 【推荐】
import scala.util.control.Exception.{allCatch,failAsValue}
// Option[V] => Some(V) : None
// V v = if(opt.isEmpty) defaultValue else opt.get
def divideOpt(a:Int,b:Int) = {allCatch.opt(a/b)
}
// Try[V] => Success(V) : Failure(Throwable)
def divideWithTry(a:Int,b:Int) = {allCatch.withTry(a/b)
}
// Either[Throwable,V] => Right(V) : Left(Throwable)
def divideEither(a:Int,b:Int) = {allCatch.either(a/b)
}
// 【推荐】参数1:异常类型,参数2:异常发生返回的值,参数3:正常返回的值
def divideFail(a:Int,b:Int) = {failAsValue(classOf[ArithmeticException])(-1)(a/b)
}

类型信息处理

case class Text(author:String,title:String,price:Float)
class TextSon(level:String,override val author:String,override val title:String,override val price:Float)
extends Text(author, title, price)
{val _level:String = leveloverride def toString() = s"TextSon{${super.toString}, ${_level}}"
}// 提取类型信息
val ci: Class[Text] = classOf[Text]val obj:Text = new TextSon("TOP","The Wild Roaring","张培元",86.32f)
// 类型判断
val isIns: Boolean = obj.isInstanceOf[TextSon]
// 类型转换:转换不当会导致 ClassCastException
val son: TextSon = obj.asInstanceOf[TextSon]
val son: Option[TextSon] = allCatch.opt(obj.asInstanceOf[TextSon])

这篇关于Scala Extention的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/932648

相关文章

【scala 安装错误】错误: 找不到或无法加载主类 scala.tools.nsc.MainGenericRunner

错误: 找不到或无法加载主类 scala.tools.nsc.MainGenericRunner 原因: Scala安装路径中包含空格。 解决办法:scala 不要安装在E:\Program Files 这种有空格的目录下,简直坑

Scala模式匹配下提取器构造

示例代码: object :> {def unapply[A] (list:List[A]) = {Some( (list.init,list.last) )}}object Extractor_Advanced {def main(args: Array[String]): Unit = {(1 to 9).toList match{ case _ :> 9 => println(

从spark源码的角度思考scala中的模式匹配

1.scala中模式匹配 2.spark源码中的模式匹配思考 spark中master会收到worker发过来的akka的消息, 此消息是case class即(Master.class中): case class RegisterWorker(id:String,host:String,port:Int,cores:Int,memory:Int,webUiPort:int

Scala界面事件处理

示例代码: import scala.swing.SimpleSwingApplicationimport scala.swing.MainFrameimport scala.swing.Buttonimport scala.swing.Labelimport scala.swing.Orientationimport scala.swing.BoxPanelimpo

Scala界面Panel、Layout初探

示例代码: package com.dt.scala.guiimport scala.swing.SimpleSwingApplicationimport scala.swing.MainFrameimport scala.swing.Buttonimport scala.swing.Labelimport scala.swing.Orientationimport scal

scala界面GUI编程实战初步了解

示例代码: import scala.swing._//SimpleSwingApplication继承自SwingApplication类(此类中有main方法,因此可以运行显示界面)object Hello_GUI extends SimpleSwingApplication {def top = new MainFrame{ //顶级容器title = "Hello GUI"co

Scala并发编程react、loop代码实战详解

示例代码及注释: //scala并发编程中的react和loop,共同特点://通过线程存用的方式让性能有所提升。//Actor本身的运行,被actor子系统管理的时候,会有一个或者多个远程的线程让当前的actor使用//一般情况下每个Actor都有自己的线程。只有有自己的线程时,我们的Actor中的actor方法才会执行。//但是,这样线程的开销会非常大,所以为了共用线

scala并发编程原生线程Actor、Case Class下的消息传递和偏函数实战

参考代码: import scala.actors._case class Person(name:String,age:Int)class HelloActor extends Actor{def act(){while(true){receive{case Person(name,age)=>{ //偏函数println("Name: "+ name + ":" +"Age:"

scala基础概念

Scala是面向行的语言,Scala 语句末尾的分号写或者不写都可以。 对象 - 对象有属性和行为。例如:一只哈士奇的属性有:颜色,名字,行为有:叫、跑、吃等。对象是一个类的实例。 类 - 类是对象的抽象;对象是类的具体实例。 方法 - 方法描述的基本的行为,一个类可以包含多个方法。 字段 - 每个对象都有它唯一的实例变量集合,即字段。对象的属性通过给字段赋值来创建。 基本语法

Scala:Scala基础语法【Scala语言是一个完全面向对象编程语言-->万物皆对象;Scala语言是一个完全函数式编程语言-->万物皆函数】

一、变量和数据类型 1、变量 说明:在Scala中声明一个变量时,可以不指定类型,编译器根据值确定 var | val 变量名 [: 变量类型] = 变量值 声明变量时,类型可以省略(编译器自动推导,即类型推导)类型确定后,就不能修改,说明Scala是强数据类型语言。变量声明时,需要初始值object TestVar {def main(args: Array[String]): Uni