`
duanhengbin
  • 浏览: 384822 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Scala备忘录

 
阅读更多

本篇特用来对Scala的日常惯用法做一些记录,尽量简洁不废话。第三方包除外,只收录标准库。

 

  1. 集合类(Seq)
  2. 集合类(Map)
  3. 正则
  4. JSON解析
  5. XML解析
  6. 语法糖
  7. 杂项
  • 集合类(Seq) 最佳

- 构建

val truth = "fly" :: "is" :: "fun" :: Nil //List(fly,is,fun)
val list1 = List(1,2)
val list2 = List.fill(3)("one")  //List[String] =List(one,one,one)
val list3 = List.fill(3,2)(0)    //List[List[Int]] =List(List(0,0),List(0,0),List(0,0))
val list4 = List.range(9,1,-3)   //List[Int] =List(9,6,3)
val list5 = truth ::: list4      //List(fly,is,fun,9,6,3)
val list6 = truth ++ list4       //List(fly,is,fun,9,6,3)

- 分组 

truth.groupBy(_.length == 2)     //((List(is),List(fly,fun))
truth.grouped(2)                 //Iterator:List(fly,is),List(fun)
truth.sliding(2)                 //Iterator:List(fly,is),List(is,fun)
 - 截取 
truth.head           //fly
truth.tail           //List(is,fun)
truth.init           //List(fly,is)
truth.last           //fun
truth.drop(2)        //List(fun)
truth.dropRight(2)   //List(fly)
truth.takeRight(2)   //List(is,fun)
truth.takeWhile(_.charAt(0).toLowerCase!='I')   //List(fly)
truth.dropWhile(_.的charAt(0).toLowerCase!='I') //List(is,fun)
 - 过滤及计数 
truth.filter(s => s.length == 3) //List(fly,fun)
truth.find(_.charAt(0)=='A')     //None
truth.count(s => s.length == 3)  //2
 - 校验
truth.isEmpty                    //false
truth.forall(_.length> 2)        //false
truth.exists(_.charAt(0)=='i')   //true
truth.contains("is")             //true
truth.sameElements(List("fly","is","fun"))  //true
 - 添加序号 
truth.zipWithIndex       //List((fly,0),(is,1),(fun的,2))
truth.indices zip truth  //Vector((0,fly),(1,),(2,fun))
- 排序 
truth.sorted                              //List(fly,fun,is)
truth.sorted(Ordering[String].reverse)    //List(is,fun,fly)
truth.sortBy(x =>(x.toString.length, x))  //List(is,fly,fun)
truth.sortBy(x =>(x.toString.length, x))(Ordering[(Int,String)].reverse)  //List(fun,fly,is)
truth.sortWith(_.length - _.length < 0)   //List(is,fly,fun)
- 折叠
truth.foldRight("!")(_ + _)    // Flyisfun!
truth.reduceRight(_ + _)       // Flyisfun
truth.foldRight(List[String]()){(x,List)=>("<"+ x +">")::List}  //List(<fly>,<is>,<fun>)
truth.foldLeft("is")(_ + _)    //isflyisfun
List(1,2,3)reduceLeft(_ + _)   //6
 - 连接 - 展开
List.concat(List(),List('b'),List('c'))   //List(b,c)
truth.flatMap(_.toList)                   //List(f, l, y, i, s, f, u, n)
  

 

  • 集合类(Map) 最佳

--不可变

val map1 = Map("i" -> 1,"ii" -> 2)
map1 + ("vi" -> 6)  //Map(i -> 1, ii -> 2, vi -> 6)
map1 - "ii"         //Map(i -> 1)
map1 ++ List("iii" -> 3,"v" -> 5)  //Map(i -> 1, ii -> 2, iii ->3, v -> 5)
map1.getOrElse("vi",6)             //6

--可变

val map2 = scala.collection.mutable.Map.empty[String,Int]
map2 += ("one" -> 1) //Map(one - > 1)
map2 -= "one"        //Map()
map2 ++= Map("one" -> 1,"two" -> 2,"three" -> 3)  //Map(one -> 1, three -> 3, two -> 2)
map2 --= List("one","two")           //Map(three -> 3)
map2.getOrElseUpdate("one",100)      //Map(one -> 100, three -> 3)
map2.getOrElseUpdate("four",200)     //Map(one -> 100, three -> 3, four -> 200)
map2.transform((_,i)=> i + 1)        //Map(one -> 101, three -> 4, four -> 201)
  

 

  • 正则 最佳

--变量取值

val reg1 = new regex("""(\d{4})-(\d{2})-(\d{2})""")
val reg2 = """(\d{4})-(\d{2})-(\d{2})""".r
val reg1(year, month, day)="2016-12-13" //year:2016 month:12 day:13
"2016-12-13" match{
  case reg2(year,month,day) => (year,month,day)  //year:2016 month:12 day:13
  case _ => prIntln("not found!")
}
--名称取值
val reg3 =new Regex("""(\d{4})-(\d{2})-(\d{2})""","year","month","day")
reg3.findAllIn("2016-12-13 american tv 2017-11-14").foreach(println)
val m1 = for (r <- reg3.findAllMatchIn("abc 2016-12-13 american tv 2017-11-14")) yield r.group("year")
println(m1.toList)    //List(2016, 2017)
--序号取值
val m2 = for (r <- reg3.findAllMatchIn("abc 2016-12-13 american tv 2017-11-14")) yield r.group(2)
println(m2.toList)    //List(12, 11)
   
  • JSON解析 最佳

【说明】2.11以后的jar包需单独下载 https://github.com/scala/scala-parser-combinators

val jsonStr=  """ {"subjects":[
  {"title":"孤单又灿烂的神:鬼怪", "rate":"9.1", "id":"26761935"},
  {"title":"西部世界第one季",   "rate":"9.0", "id":"2338055"}] }"""

//一次性使用可以用 asInstanceOf做类型转换,转换后为List,Map,和数组的混合体
val map= JSON.parseFull(jsonStr).get.asInstanceOf [Map[String,List[Map[String,String]]]]
val list = (for (m <- map("subjects")) yield List(m("id"), m("title"), m("rate")))
println(list)    //List(List(26761935, 孤单又灿烂的神:鬼怪, 9.1), List(2338055, 西部世界第one季, 9.0))

//需要异常处理的场合使用模式匹配
val map2 = JSON.parseFull(jsonStr) match {
  case m: Map[String,List[Map[String,String]]] => m
  case _ => //todo 异常处理如: println("解析失败:"+ jsonStr)
}
  
  • XML解析 最佳

【说明】2.11以后的jar包需单独下载https://github.com/scala/scala-xml

--构建

val elem1 = scala.xml.XML.loadString("<HTML> </HTML>")
val elem2 = scala.xml.XML.loadFile("1.XML")
val (name, age)=("James",10)
val elem3 = <html>name={name},age={age}</html>
val elem4 = <r>{(1 to 5).map(i => <e>{i}</e>)}</r>
         // <r><e>1</e><e>2</e><e>3</e><e>4</e><e>5</e></r>

--节点抽取

val elem  = <uu><u name ="aa"/><u name ="bb"/><u name ="cc"/></uu>
val name1 = (elem \"u")(0)\"@name"      //aa
val name2 = elem \"u"\\"@name"          //aa bb cc

elem match{
  case <uu>{uAll @ _*}</uu> =>
    for(u <- uAll) println(u \ "@name") //aa bb cc
  case _ => "no match!"
}

val xml=
<shopping>
  <item name="bread" quantity="3" price="2.50"/>
  <item name="milk"  quantity="2" price="3.50"/>
</shopping>
(for(item <- xml\"item";
       p = (item\"@price").text.toDouble;
       q = (item\"@quantity").text.toInt)
yield (p*q)).map(println)

 

--XML输出

val pp = new scala.xml.PrettyPrInter(80,4)    //行宽80,缩进4
prIntln(elem)                    //直接输出
prIntln(pp formatNodes elem)     //格式化输出
  
  • 语法糖最佳

// 观察语法糖对理解Scala内部的实现非常必要,使用这个命令 scala -Xprint:typer test.scala

// case class 语句会自动给类中添加 equals/ hashCode/ toString/ copy/ apply/ unapply 等方法

// 特别是 apply 用于 类名() 语法生成对象(不使用new!)

// 而 unapply 用于模式匹配时项目的抽取

case class People( name: String, age: Int);
val p = People("zhangshan",20)
p match {
  case People(name,age) => println(name,age)
}

 

// for 语句会变换成 foreach(foreache...))

// for-yield 会变换成  flatMap(flatMap(...map()))      注意最后一级为map

// for 语句中含有if 则会转换成 withFilter()调用

val (f1,f2,f3) = (Future{1}, Future{1}, Future{1})
for{  a <- f1;  b <- f2;  c <- f3 } yield a+b+c

// lazy变量,背后的实现是个典型的双重检测锁(DCL)模式

 

  • 杂项 最佳

- 任意数生成

//生成[0,N)的任意数 - 同java.util.Random中
Random.nextInt(99999)
//生成任意5位字母数字
Random.alphanumeric.take(5).mkString

 

 

0
0
分享到:
评论

相关推荐

    Scala-升级版.docx

    Scala是一种强大的多范式编程语言,它在Java虚拟机(JVM)上运行,并结合了面向对象和函数式编程的概念。Scala这个名字来源于“Scalable Language”,表明它旨在支持从小规模到大规模的软件开发。 Scala的主要特点...

    scala sdk scala-2.12.3

    Scala SDK,全称为Scala Software Development Kit,是用于开发Scala应用程序的核心工具集。Scala是一种多范式的编程语言,融合了面向对象和函数式编程的特点,它运行在Java虚拟机(JVM)上,能够充分利用Java生态...

    scala3 scala3 scala3 scala3 scala3

    Scala3,也被称为Scala 3或Dotty,是Scala编程语言的一个重大更新,旨在提高其简洁性、可读性和类型安全性。Scala3的发布标志着该语言的进一步成熟,它引入了一系列改进,旨在解决早期版本中的一些痛点,同时保持对...

    Scala-CheatSheet:最大的Scala备忘单

    通过这个Scala备忘单,无论是初学者还是经验丰富的开发者,都可以快速查找和理解Scala的关键特性,提升编程效率。在实际使用中,结合Jupyter Notebook进行实验和学习,可以更直观地理解和应用这些知识。

    scala2.12.1Windows镜像包

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。这个"scala2.12.1Windows镜像包"是为Windows操作系统设计的Scala编程环境的安装包,版本号为2.12.1。Scala 2.12.x系列是其重要的一个稳定...

    scala-2.12.10.zip

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。这个"scala-2.12.10.zip"文件是Scala编程语言的特定版本——2.12.10,专为Windows操作系统设计的安装包。Scala 2.12.x系列是该语言的一个...

    scala + mybatis 数据库查询

    Scala是一种强大的多范式编程语言,它结合了面向对象和函数式编程的特性。MyBatis则是一款流行的Java持久层框架,主要用于简化数据库操作。在本项目中,"scala + mybatis 数据库查询",我们将探讨如何将Scala与...

    scala-2.12.10.tgz

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。Scala运行在Java虚拟机(JVM)上,并且可以充分利用Java的生态系统。`scala-2.12.10.tgz`是一个针对Linux操作系统的Scala安装包,它的版本号...

    scala实战高清讲解

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,使得它在处理并发和大数据分析方面表现出色。"Scala实战高清讲解"这本书是学习Scala的宝贵资源,尤其对于那些希望深入理解并提升Scala技能的...

    Scala语法简明教程

    ### Scala语法简明教程知识点详解 #### Scala语言简史 - **诞生历史**:Scala起源于瑞士联邦理工学院洛桑(EPFL),由Martin Odersky在2001年开始设计,其灵感来源于Funnel——一种结合了函数式编程思想与Petri网...

    最好的scala学习 课件

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,被广泛应用于大数据处理领域,特别是与Apache Spark相结合时。本课件是针对Scala学习者精心准备的资源,旨在帮助你深入理解和掌握Scala的...

    Scala考试题1

    Scala 是一种多范式的编程语言,它融合了面向对象和函数式编程的特性。下面将详细解释题目中涉及的Scala知识点: 1. **var、val 和 def 的区别**: - `var` 定义可变变量,可以多次赋值。 - `val` 定义不可变变量...

    scala-2.11.8.rar

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性。这个"scala-2.11.8.rar"压缩包包含了Scala语言的2.11.8版本的源代码,这对于理解Scala的工作原理、学习高级编程技巧以及进行自定义扩展或...

    windows版scala-2.11.12.zip

    在这个"windows版scala-2.11.12.zip"压缩包中,包含的是Scala 2.11.12版本的Windows兼容安装文件,这是Scala的一个稳定版本,适用于开发人员在Windows操作系统上进行Scala编程。 Scala 2.11.x系列是Scala的一个主要...

    学习scala好的项目

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,被广泛应用于大数据处理、分布式计算和Web开发等领域。Spark是基于Scala构建的大数据处理框架,其高性能和易用性使得Scala在大数据领域备受...

    scala学习源代码

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性。这个"scala学习源代码"的压缩包文件很可能包含了用于教学或自我学习Scala编程的基础示例。让我们深入了解一下Scala语言的关键概念和特性。 ...

    scala-2.12.14.zip&scala-2.12.11.tgz Linux版本压缩包.rar

    Scala是一种强大的多范式编程语言,它融合了面向对象编程和函数式编程的概念,被广泛应用于大数据处理和分布式计算领域,特别是在Apache Spark等框架中。标题提到的"scala-2.12.14.zip&scala-2.12.11.tgz"是Scala的...

    scala-2.11.12 win msi 安装包

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。这个压缩包提供的文件是"scala-2.11.12 win msi 安装包",适用于Windows操作系统,版本号为2.11.12。这个版本的Scala是官方发布的,虽然原...

    Scala-2.11.1.zip

    Scala是一种强大的静态类型编程语言,它融合了面向对象和函数式编程的概念,旨在提供一种可扩展的、高效的编程环境。Scala这个名字是“Scalable Language”的缩写,它旨在克服Java的一些局限性,同时保留其平台兼容...

Global site tag (gtag.js) - Google Analytics