`
duanhengbin
  • 浏览: 383412 次
  • 性别: 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-CheatSheet:最大的Scala备忘单

    Scala-CheatSheet:最大的Scala备忘单

    Scala-升级版.docx

    scala学习宝典

    scala sdk scala-2.12.3

    scala-2.12.3 scala-2.12.3 scala-2.12.3 scala-2.12.3

    scala-sbt-scala编译工具

    scala 编译工具 sbt 安装包。 Little or no configuration required for simple projects Scala-based build definition that can use the full flexibility of Scala code Accurate incremental recompilation ...

    scala语言的学习记录

    自己在学习大数据的相关内容的时候,学习了Scala,记录了大部分知识点,可供参考

    Scala编程实战.zip

    此文档是讲解实战Scala,希望对喜欢大数据的同学有所帮助!!! 学习Scala语言,不仅仅意味着熟悉新的API,更重要的是一种思维方式的转变。从原有的面向对象编程(OO)到函数式编程(FP)的思想。本书面向实际的使用场景...

    scala2.12.1Windows镜像包

    scala2.12.1Windows镜像包

    Scala函数式编程

    很大篇幅都放在,使用scala实现scala默认库文件的API中,通过对简单的函数式编程逻辑的介绍和实践,主要是实践,建立起来一个比较明晰的scala思维模式,或者叫函数式编程的思维模式。 2 无副作用的函数式编程,同时...

    scala 2.13.3 API 文档 Html离线版 scala-api.rar

    最新制作 scala 2.13.3 API 文档 Html离线版 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala 运行在 Java 虚拟机上,并兼容现有的 Java 程序。

    scala五本经典资料集合

    scala是一个经典的语言,Scala代表了一个新的语言品种,它抹平了这些人为划分的界限。但是现在scala的相关学习资料不多,因此,本人总结了几篇写的较好的scala学习资料,包含&lt;ScalaQuery_Commerzbank_2011&gt;&lt;twitter-...

    scala3 scala3 scala3 scala3 scala3

    scala3 scala3 scala3 scala3 scala3

    scala编程中文pdf

    scala编程 33章 中文pdf Scala编程实战 目录 第1章字符串. 11 第2章数值39 第3章控制结构.60 第4章类和属性.103 第5章方法147 第6章对象170 第7章包和导入.190 第8章特质200 第9章函数式编程214 第10 章集合242 第...

    scala实战高清讲解

    scala编程进阶过程中不可或缺的书籍之一,详细介绍了scala语言的各种中高级语法,对于初学和高级开发人员有很大帮助

    最好的scala学习 课件

    最好的scala 学习课件,最好的scala 学习课件,学习spark必备

    Scala实用指南

    本书是为想要快速学习或者正在学习 Scala 编程语言的 Java 开发者写的,循序渐进地介 绍了 Scala 编程语言的多个方面。 本书共分为 4 个部分:第一部分详细介绍 Scala 的一些基础知识,并和 Java 中的相关概 念进行...

    eclipse插件 scala下载

    scala eclipse插件 拷贝到相应的目录即可使用,百度一大堆

    快学scala 完整

    快学scala 完整清晰版 大数据spark 主要的编程语言 快学scala 完整清晰版 大数据spark 主要的编程语言

    scala 3本书打包

    这个打包文件中包含了《SCALA程序设计-JAVA虚拟机多核编程实战》《Scala编程-中文-完整版》《Scala in Action》三本书,足以让你从scala入门到精通,让我们一起愉快的学习吧。spark,scala醉了醉了。哈哈

    scala + mybatis 数据库查询

    这是一个简单实用的scala集成mybatis数据库查询代码,简单明了

Global site tag (gtag.js) - Google Analytics