Scala起步

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、当前类及其伴生对象例外。













展开阅读全文

没有更多推荐了,返回首页