var和val
val和var都可以用来定义变量。用val定义的变量时不可变的,初始化之后,值就固定了。用var定义的变量是可变的,修改次数不受限制。这里的不变性指的是变量本身,而不是变量所引用的实例。
点和括号是可选的
package com.fanshadoop
object HelloWorld {
def main(args: Array[String]): Unit = {
for (i <- 1 until 3) {
print( i + ",");
}
for (i <- 1 to 3) {
print( i + ",");
}
}
}
在scala中一切皆对象,而在Java中存在基本类型int,double等非对象。在上例中1 until 3相当于1.until(3)。unitl和to是RichInt的方法。如果方法有0或1个参数,点和括号是可选的,如果方法参数多余一个,就不许使用括号,但点依旧是可选的。
package com.fanshadoop
object HelloWorld {
def main(args: Array[String]): Unit = {
(1 to 4).foreach(i => println(i+ ","))
}
}
Range类的foreach方法,接受一个方法作为参数,所以必须在括号里提供一段代码体,接受一个实参。=>将参数列表右边的实现分离开来。
package com.fanshadoop
class ScalaInt {
def playwithInt(){
val capacity:Int =10//将Scala.Int作为JavaInt
val list = new java.util.ArrayList[String]
list.ensureCapacity(capacity)
}
}
元组和多元赋值
元组是一个不变的对象序列,可以用逗号分隔的值进行创建。
package com.fanshadoop
object Mutilvalue {
def getPersonInfo(primaryKey: Int) = {
("name","sex","age")
}
def main(args:Array[String]) = {
val (iname, isex,iage) = getPersonInfo(1);//若声明的变量数与方法返回的不一致,还有编译错误
println("iname="+iname)
println("isex="+isex)
println("iage="+iage)
}
}
package com.fanshadoop
object Mutilvalue {
def getPersonInfo(primaryKey: Int) = {
("name","sex","age")
}
def main(args:Array[String]) = {
val info = getPersonInfo(1);//另类访问方式
println("iname="+info._1)
println("sex="+info._2)
}
}
字符串和多行原始字符串
在scala中,多行字符串:把字符串放在3个引号中间即可。scala会将三个引号内的内容保持原样。也可以使用RichString的stripMartin()方法,去掉空白或控制符。
自适应默认做法
1)return是可选的。加入符合方法声明的返回类型、方法调用会自动返回最后求值的表达式。
2)分号是可选的。如果想在同一行内放置多条语句,可以使用分号进行分割。
3)类和方法默认是public。
4)scala提供了轻量级的语法创建JavaBean。
5)不会强制捕获一些不关心的异常。
6)默认Scala会导入两个包和scala.Predef对象,以及相应的类和成员。导入顺序:java.lang、scala和scala.Predef
运算符重载
从技术角度来看,Scala没有运算符,如+,-等。在Scala里,这些实际上是方法名:运算符利用了scala灵活的方式调用语法。
package com.fanshadoop
class Complex(val real : Int, val imaginary: Int) {
def +(operand:Complex):Complex = {
new Complex(real + operand.real, imaginary + operand.imaginary)
}
override def toString():String = {
real + (if (imaginary < 0) "" else "+") + imaginary+ "i"
}
}
package com.fanshadoop
import java.util.ArrayList
object HelloWorld {
def main(args: Array[String]): Unit = {
val c1 = new Complex(1,4)
val c2 = new Complex(3,7)
val sum = c1 + c2
println(sum toString)
}
}
方法的第一个字符决定了它的优先级:
|
^
&
< >
= !
:
+ -
* / %
Scala的细节
1)赋值结果:scala中的赋值运算的结果是Unit。
2)scala对==的处理不同于Java。在scala中,==表示基于值的比较,这点由Any类(Scala中所有类都是从它)把==()实现成final得到了保证。如果想为某个类的比较对比方法提供特定的实现,就需要改写equals()方法。基于身份的比较实用eq()方法。
3)分号是半可选的
package com.fanshadoop
object Anonymos {
def main(args:Array[String]) = {
val list = new java.util.ArrayList[Int];
{//代码块
println("create list1")
}
val list2 = new java.util.ArrayList[Int]{//list2指向了这个内部匿名类实现,而不是直接的ArrayList
println("create list2")
}
println(list.getClass())
println(list2.getClass())
}
}
4)Scala权限
scala默认为public。
scala可以对可见性进行细粒度的控制。
scala的protected,只有派生类可以访问,不过scala可以给与protected更自由、更灵活的解释
private和protected修饰符可以指定额外的参数:private[AccessQualifier],其中AccessQualifier可以是this也可是外围类的名字或包的名字。含义:这个成员类对所有类都是private、当前类及其伴生对象例外。