本篇特用来对Scala的日常惯用法做一些记录,尽量简洁不废话。第三方包除外,只收录标准库。
- 构建
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)
--不可变
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)
【说明】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) }
【说明】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
相关推荐
Scala是一种强大的多范式编程语言,它在Java虚拟机(JVM)上运行,并结合了面向对象和函数式编程的概念。Scala这个名字来源于“Scalable Language”,表明它旨在支持从小规模到大规模的软件开发。 Scala的主要特点...
Scala SDK,全称为Scala Software Development Kit,是用于开发Scala应用程序的核心工具集。Scala是一种多范式的编程语言,融合了面向对象和函数式编程的特点,它运行在Java虚拟机(JVM)上,能够充分利用Java生态...
Scala3,也被称为Scala 3或Dotty,是Scala编程语言的一个重大更新,旨在提高其简洁性、可读性和类型安全性。Scala3的发布标志着该语言的进一步成熟,它引入了一系列改进,旨在解决早期版本中的一些痛点,同时保持对...
通过这个Scala备忘单,无论是初学者还是经验丰富的开发者,都可以快速查找和理解Scala的关键特性,提升编程效率。在实际使用中,结合Jupyter Notebook进行实验和学习,可以更直观地理解和应用这些知识。
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。这个"scala2.12.1Windows镜像包"是为Windows操作系统设计的Scala编程环境的安装包,版本号为2.12.1。Scala 2.12.x系列是其重要的一个稳定...
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。这个"scala-2.12.10.zip"文件是Scala编程语言的特定版本——2.12.10,专为Windows操作系统设计的安装包。Scala 2.12.x系列是该语言的一个...
Scala是一种强大的多范式编程语言,它结合了面向对象和函数式编程的特性。MyBatis则是一款流行的Java持久层框架,主要用于简化数据库操作。在本项目中,"scala + mybatis 数据库查询",我们将探讨如何将Scala与...
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。Scala运行在Java虚拟机(JVM)上,并且可以充分利用Java的生态系统。`scala-2.12.10.tgz`是一个针对Linux操作系统的Scala安装包,它的版本号...
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,使得它在处理并发和大数据分析方面表现出色。"Scala实战高清讲解"这本书是学习Scala的宝贵资源,尤其对于那些希望深入理解并提升Scala技能的...
### Scala语法简明教程知识点详解 #### Scala语言简史 - **诞生历史**:Scala起源于瑞士联邦理工学院洛桑(EPFL),由Martin Odersky在2001年开始设计,其灵感来源于Funnel——一种结合了函数式编程思想与Petri网...
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,被广泛应用于大数据处理领域,特别是与Apache Spark相结合时。本课件是针对Scala学习者精心准备的资源,旨在帮助你深入理解和掌握Scala的...
Scala 是一种多范式的编程语言,它融合了面向对象和函数式编程的特性。下面将详细解释题目中涉及的Scala知识点: 1. **var、val 和 def 的区别**: - `var` 定义可变变量,可以多次赋值。 - `val` 定义不可变变量...
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性。这个"scala-2.11.8.rar"压缩包包含了Scala语言的2.11.8版本的源代码,这对于理解Scala的工作原理、学习高级编程技巧以及进行自定义扩展或...
在这个"windows版scala-2.11.12.zip"压缩包中,包含的是Scala 2.11.12版本的Windows兼容安装文件,这是Scala的一个稳定版本,适用于开发人员在Windows操作系统上进行Scala编程。 Scala 2.11.x系列是Scala的一个主要...
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,被广泛应用于大数据处理、分布式计算和Web开发等领域。Spark是基于Scala构建的大数据处理框架,其高性能和易用性使得Scala在大数据领域备受...
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性。这个"scala学习源代码"的压缩包文件很可能包含了用于教学或自我学习Scala编程的基础示例。让我们深入了解一下Scala语言的关键概念和特性。 ...
Scala是一种强大的多范式编程语言,它融合了面向对象编程和函数式编程的概念,被广泛应用于大数据处理和分布式计算领域,特别是在Apache Spark等框架中。标题提到的"scala-2.12.14.zip&scala-2.12.11.tgz"是Scala的...
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。这个压缩包提供的文件是"scala-2.11.12 win msi 安装包",适用于Windows操作系统,版本号为2.11.12。这个版本的Scala是官方发布的,虽然原...
Scala是一种强大的静态类型编程语言,它融合了面向对象和函数式编程的概念,旨在提供一种可扩展的、高效的编程环境。Scala这个名字是“Scalable Language”的缩写,它旨在克服Java的一些局限性,同时保留其平台兼容...