scala的一些特殊用法
1.创建多行字符串,只要把多行字符串放在3个双引号间("""...""")即可。这是Scala对于here document,或者叫heredoc的支持。这里我们创建一个三行长的字符串:
MultiLine.scala
val str = """Hello world!
How are you!
Good morning!"""
println(str)
输出如下:
Hello world!
How are you!
Good morning!
请按任意键继续. . .
2.运算符优先级
Scala没有定义运算符的优先级,但它定义了方法的优先级。
方法名的第一个字符决定了它的优先级。如果表达式里面有两个具有相同优先级的字符,那么左边的运算符优先级更高。下面从低到高列出了首字符的优先级:
所有字母
|
^
&
< >
= !
:
+ -
* / %
所有其他特殊字符
举例如下:
Complex.scala
class Complex(val real:Int, val imag:Int) {
def +(operand:Complex):Complex={
println("Calling +")
new Complex(real+operand.real , imag+operand.imag)
}
def *(operand:Complex):Complex={
println("Calling *")
new Complex(real*operand.real - imag*operand.imag , real*operand.imag + imag*operand.real )
}
override def toString():String = {
real + (if(imag<0) ""else "+")+ imag + "i"
}
}
object Complex extends App {
val c1 = new Complex(1,4)
val c2 = new Complex(2,-3)
val c3 = new Complex(2,2)
// val sum = c1 + c2
// println("(" + c1 + ") + (" + c2 + ")=" + sum )
println(c1+c2*c3)
}
运行结果如下:
Calling *
Calling +
11+2i
3. 类继承
在scala里,继承一个基类跟Java的做法很相似,只是多了两点限制:
(1)重写方法需要override关键字
(2)只有主构造函数才能往基类构造函数中传参数
下面是继承一个基类的例子:
Vehicle.scala
class Vehicle(val id:Int, val year:Int) {
override def toString(): String = "ID:" + id + " Year:" + year
}
class Cars(override val id:Int, override val year:Int,
var fuelLevel:Int)extends Vehicle(id,year){
override def toString(): String = super.toString()+ " Fuel Level:" + fuelLevel
}
object Cars extends App {
val car = new Cars(1, 2010, 100)
println(car)
}
程序运行结果如下:
ID:1 Year:2010 Fuel Level:100
4. Scala中的static
Scala中没有静态字段和静态方法。静态字段和静态方法会打破Scala所支持的完整的面向对象模型。不过,scala也是完全支持类一级的属性和操作的。这就是伴生对象的作用。
举例如下:
Marker.scala
class Marker private(val color:String) {
override def toString():String = "marker color "+color
}
object Marker extends App{
private val markers = Map(
"red" -> new Marker("red"),
"blue" -> new Marker("blue"),
"green" -> new Marker("green")
)
def primaryColors = "red, green, blue"
def apply(color:String) = if(markers.contains(color))
markers(color) else null
println("Primary colors are:" + Marker.primaryColors)
println(Marker("blue"))
println(Marker("red"))
}
程序运行结果如下:
Primary colors are:red, green, blue
marker color blue
marker color red
5. Option类型
Scala想让意图更清晰的表达出来,确实有时候我们就需要没有结果。Scala以一种类型安全的方式做到这一点:它使用Option[T]类型。举例如下:
OptionExample.scala
object OptionExample extends App{
def commentOnPractice(input:String) = {
//rather than returning null
if(input == "test") Some("good") else None
}
for(input <- Set("test","hack")){
val comment = commentOnPractice(input)
println("input "+input+"comment "+comment.getOrElse("Found no comments"))
}
}
程序运行结果如下:
input testcomment good
input hackcomment Found no comments
将类型显式声明为Option[String],Scala会强制我们检查实例的不存在。如此一来,就不太可能因为没有检查null引用而抛出NullPointerException。调用返回Option[T]的getOrElse()方法,可以主动的应对结果不存在(None)的情形。
6.方法返回类型推演
除了推演变量的类型,Scala也会尝试推演方法返回值的类型。不过,这有个陷阱,推演会依赖于方法如何定义。如果用等号(=)定义方法,Scala就可以推演返回类型。否则,它就假设方法是一个void方法。
7. 隐式类型转换
举例如下:
import java.util._
class DateHelper(number:Int) {
def days(when:String):Date = {
var date = Calendar.getInstance()
when match {
case DateHelper.ago => date.add(Calendar.DAY_OF_MONTH, -number)
case DateHelper.from_now => date.add(Calendar.DAY_OF_MONTH, number)
case _ => date
}
date.getTime();
}
} object DateHelper extends App{
val ago = "ago"
val from_now = "from_now"
implicit def convertInt2DateHelper(number:Int) = new DateHelper(number)
val past = 2 days ago
val appointment = 5 days from_now
println(past)
println(appointment)
}
程序运行结果如下:
Fri Mar 13 16:49:06 CST 2015
Fri Mar 20 16:49:06 CST 2015
7. 使用Set,合并Set集
如果需要将两个Set合并成一个新的Set,可以用++():
scala> val feeds1 = Set("blog.toolshed.com","pragdave.pragprog.com","pragmactic-
osxer.blogspot.com","vita-contemplativa.blogspot.com")
feeds1: scala.collection.immutable.Set[String] = Set(blog.toolshed.com, pragdave
.pragprog.com, pragmactic-osxer.blogspot.com, vita-contemplativa.blogspot.com)
scala> val feeds2 = Set("blog.toolshed.com","martinfowler.com/bliki")
feeds2: scala.collection.immutable.Set[String] = Set(blog.toolshed.com, martinfo
wler.com/bliki)
scala> val mergedFeeds = feeds1 ++ feeds2
mergedFeeds: scala.collection.immutable.Set[String] = Set(pragdave.pragprog.com,
pragmactic-osxer.blogspot.com, vita-contemplativa.blogspot.com, blog.toolshed.c
om, martinfowler.com/bliki)
scala> println("# of merged feeds:" + mergedFeeds.size)
# of merged feeds:5
Set至多持有每个元素一次,从输出里可以看到这一点,在合并后的Set里,两个Set里公共的元素只存储一次:
如果想在每个元素前面加上“http://",可以用map()方法:
scala> val urls = feeds1 map("http://"+_)
urls: scala.collection.immutable.Set[String] = Set(http://blog.toolshed.com, http://pragdave.pragprog.com, http://pragmactic-osxer.blogspot.com, http://vita-con
templativa.blogspot.com)
如果准备对Set集进行迭代,一次一个的进行刷新,可以用内建的迭代器foreach(),像这样:
scala> feeds1 foreach{ feed => println(" Refreshing " + feed)}
Refreshing blog.toolshed.com
Refreshing pragdave.pragprog.com
Refreshing pragmactic-osxer.blogspot.com
Refreshing vita-contemplativa.blogspot.com
8. 用Scala实现集合中相邻元素间的差值
如何计算同一集合中元素两两之间的差值,即求集合(a,b,c,d)中的(b-a,c-b,d-c)
实现方法如下:
scala> val l1 = 1 to 10 toList
warning: there were 1 feature warning(s); re-run with -feature for details
l1: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> val l2 = l1.tail
l2: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10) scala> l1.zip(l2).map(p=>(p._2-p._1))
res1: List[Int] = List(1, 1, 1, 1, 1, 1, 1, 1, 1)
代码含义解释如下:
- tail表示一个集合中除首元素外的剩余元素,也是一个集合。
- zip将两个集合组成一个数值对集合,比如原来有两个集合分别是(a,b,c,d), (1,2,3,4),使用zip之后,形成((a,1),(b,2),(c,3),(d,4)),如果两个集合长度不一致,多余元素将被舍去。
- map操作中的p._1和p._2表示tuple(元组)中的第一个元素和第二个元素
- head和tail head表示头元素,tail表示除head之外的剩余元素集合
- init和last last表示尾元素, init表示除尾元素之外的剩余元素集合
scala的一些特殊用法的更多相关文章
- Scala进阶之路-Scala中的枚举用法案例展示
Scala进阶之路-Scala中的枚举用法案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Scala中的枚举值和Java中的枚举值有点差别,不过使用起来也都差大同小异,我这 ...
- Scala中apply的用法
Scala中的 apply 方法有着不同的含义, 对于函数来说该方法意味着调用function本身, 以下说明摘自Programming in Scala, 3rd Edition Every fun ...
- scala之split()函数用法
split()函数: def split(arg0: String): Array[String] def split(arg0: String, arg1: Int): Array[String] ...
- Spark Scala当中reduceByKey的用法
[学习笔记] /*reduceByKey(function)reduceByKey就是对元素为KV对的RDD中Key相同的元素的Value进行function的reduce操作(如前所述),因此,Ke ...
- scala下划线的用法
1.作为“通配符”,类似Java中的*.如import scala.math._2.:_*作为一个整体,告诉编译器你希望将某个参数当作参数序列处理!例如val s = sum(1 to 5:_*)就是 ...
- Scala 中下划线的用法
1.存在性类型:Existential types def foo(l: List[Option[_]]) = ... 2.高阶类型参数:Higher kinded type parametersca ...
- scala中“_”的用法
参见链接 http://blog.csdn.net/i6448038/article/details/50017427
- Scala入门4(_的用法)
从网上找了一篇博客,详细讲解了Scala下划线的用法,这里做保留 博客链接
- Scala 中下划线的用途
转载自:https://my.oschina.net/leejun2005/blog/405305 Scala 作为一门函数式编程语言,对习惯了指令式编程语言的同学来说,会不大习惯,这里除了思维方式之 ...
随机推荐
- WCF服务发布到IIS中去(VS2013+win7系统)
第一个WCF程序 1. 新建立空白解决方案,并在解决方案中新建项目,项目类型为:WCF服务应用程序.建立完成后如下图所示: 2.删除系统生成的两个文件IService1.cs与Service1.svc ...
- 微信JS-SDK之图像接口开发详解
由于现在手头的项目中有一个上传证件照认证的功能(手机端),之前的思路是直接点击上传,然后直接将图片上传到服务器去,这篇文章有讲到(http://www.cnblogs.com/it-cen/p/453 ...
- js判断某年某月有多少天
function getCountDays(ym) { var curDate = new Date(ym); /* 获取当前月份 */ var curMonth = curDate.getMonth ...
- CodeForces 140C New Year Snowmen(堆)
题面 CodeForces 题解 因为要保证两两不同,所以不能单纯的开堆来维护,堆维护一个二元组,个数为第一关键字,编号为第二关键字,对于一个相同的颜色,统计一下这个颜色的个数再用堆来维护就好了. # ...
- 历史文章分类汇总-Anaconda安装第三方包(whl文件)
本文主要是对公众号之前发布的文章进行分类整理,方面大家查阅,以后会不定期对文章汇总进行更新与发布. 一.推荐阅读: Anaconda安装第三方包(whl文件) 福布斯系列之数据分析思路篇 福布斯系 ...
- hdu 4417 区间内比h小的数 线段树
题意求区间内比h小的数的个数 将所有的询问离线读入之后,按H从小到大排序.然后对于所有的结点也按从小到大排序,然后根据查询的H,将比H小的点加入到线段树,然后就是一个区间和. 2015-07-27:专 ...
- SQL SERVER中获取表间主外键关系
sql server 2008中的主外键关系获取方式: 转自:http://www.cnblogs.com/ke10/archive/2012/06/11/2544655.html SELECT OB ...
- Codeforces Round #297 (Div. 2)B. Pasha and String 前缀和
Codeforces Round #297 (Div. 2)B. Pasha and String Time Limit: 2 Sec Memory Limit: 256 MBSubmit: xxx ...
- UOJ 12 猜数 数学题
[UER #1]猜数 这一天,小Y.小D.小C正在愉快地玩耍. 小Y是个数学家,他一拍脑袋冒出了一个神奇的完全平方数 n. 小D是个机灵鬼,很快从小Y嘴里套出了 n 的值.然后在脑内把 n 写成了 a ...
- SDWebImage支持WebP格式图片
SDWebImage本身就已经支持了webp格式的图片 1.下载libwebp https://github.com/webmproject/libwebp 然后你需要先安装好有homebrew或者m ...