Scala总结

本文介绍了Scala编程语言的基础概念,包括变量与常量的定义、数据类型、控制结构、函数定义及使用、集合操作等内容。
常量与变量的定义
  • 变量(var)
//语法
//var VariableName : DataType [=  Initial Value]
var year = 	2018
var year2 : Int = 2018
var name = "Scala"
var name2 : String = "Scala"
  • 常量(val)
//语法
//val VariableName : DataType [=  Initial Value]
val year = 2018
val year2 : Int = 2018
val name = "Scala"
val name2 : String = "Scala" 
  • 多个变量常量申明
var year1,year2 = 2018
val name1,name2 = "Scala"
Scala常用数据类型
数据类型描述
Byte8位有符号补码整数 数值区间为 -128 到 127
Short16位有符号补码整数。数值区间为 -32768 到 32767
Int32位有符号补码整数。数值区间为 -2147483648 到 2147483647
Long64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807
Float32位IEEE754单精度浮点数
Double64位IEEE754单精度浮点数
Char16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFF
String字符序列
Booleantrue或false
Unit表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。
Nullnull 或空引用
NothingNothing类型在Scala的类层级的最低端;它是任何其他类型的子类型。
AnyAny是所有其他类的超类
AnyRefAnyRef类是Scala里所有引用类(reference class)的基类
  • Int 或 Long
//Int
var n1 = 10
//Long
var n2 = 10L
  • Double 或 Float
//Double
var n1 = 10.5
//Float
var n2 = 10.5F
String 对象是可变还是不可变?假如要创建一个可以修改的字符串,应该使用哪个类?

不可变。使用StringBuilder类

val buf = new StringBuilder
      buf += 'a'
      buf ++= "bcdef"
转义字符
转义字符Unicode描述
\b\u0008退格(BS) ,将当前位置移到前一列
\t\u0009水平制表(HT) (跳到下一个TAB位置)
\n\u000a换行(LF) ,将当前位置移到下一行开头
\f\u000c换页(FF),将当前位置移到下页开头
\r\u000d回车(CR) ,将当前位置移到本行开头
"\u0022代表一个双引号(")字符
\u0027代表一个单引号(’)字符
\\u005c代表一个反斜线字符 ‘’
IF…ELSE 语法
//第一种
if(布尔表达式)
{
   // 如果布尔表达式为 true 则执行该语句块
}

//第二种
if(布尔表达式){
   // 如果布尔表达式为 true 则执行该语句块
}else{
   // 如果布尔表达式为 false 则执行该语句块
}

//第三种
if(布尔表达式 1){
   // 如果布尔表达式 1 为 true 则执行该语句块
}else if(布尔表达式 2){
   // 如果布尔表达式 2 为 true 则执行该语句块
}else if(布尔表达式 3){
   // 如果布尔表达式 3 为 true 则执行该语句块
}else {
   // 如果以上条件都为 false 执行该语句块
}
Scala循环-for循环

语法:

for( var x <- Range ){
	statement(s);
 }

以上语法中,Range 可以是一个数字区间表示 i to j ,或者 i until j。左箭头 <- 用于为变量 x 赋值。

//i to j,包含j
var i = 0
for(i <- 1 to 3){
	println(i)//结果:1,2,3
}


//i until j,不包含j
var j = 0 
for(j <- 1 until 3){
	println(j)//结果:1,2
}
函数
  • 函数定义
//语法
def functionName ([参数列表]) : [return type] = {
   function body
   return [expr]
}

例1:

//传入参数,得到返回值
def addFunction(a:Int,b:Int) : Int={
	//可不写return,默认返回最后一行的值
	return a+b
}

例2:

//没有返回值
def printMethod = println("无返回值")
//Unit
def printMethod2 : Unit = println("无返回值2")
//
def printMethod3() = println("无返回值2")

例3:

//默认参数
def defaultMethod(name:String='doudou'):String={
	name
}

例4:

  // 变长参数
  def sum(nums: Int*) = {
    var result = 0
    for(num <- nums) {
      result += num
    }
    result
  }
闭包

闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。

var n1 = 10
val result = (n3:Int) => n3+n1
11.val a = 10,怎样将a转为double类型、String类型?
a.toString
a.toDouble
a.asinstanOf[Double]
12.Scala函数中是把方法体的最后一行作为返回值,需不需要显示调用return?

不需要

13.怎样定义一个字符串数组?下标是从1开始的吗?
var z:Array[String] = new Array[String](3)
var z = new Array[String](3)
var z = Array("1","2","3")

下标从0开始

14.1 to 10 ==> 1.to(10),10包含不包含?

包含

15.Range(1, 10),1 until 10包含不包含?

都不包含

16.Scala 模式匹配语法是什么?

match

object Test {
   def main(args: Array[String]) {
      println(matchTest(3))
   }
   def matchTest(x: Int): String = x match {
      case 1 => "one"
      case 2 => "two"
      case _ => "many"
   }
}
17.异常报错是语法?
import java.io.FileReader
import java.io.FileNotFundExcepiton
import java.io.IOException

Object Test{
	def main(args : Array[String){
		try{
			val f = new File("input.txt")
		}catch{
			case ex: FileNotFundExcepiton =>{
				println("FileNotFundExcepiton")
			}
			case ex: IOException =>{
				println("IOException")
			}
		}
	}
}
18.Array、ArrayBuffer,谁是定长?谁是变长?

Array 定长
ArrayBuffer 变长

19.什么是隐式转换函数?什么场景下用?怎样定义?
//标记规则:只有标记为implicit的变量,函数或对象定义才能被编译器当做隐式操作目标。
implicit val i: Int = 1
//关键字:implicit
20.Scala面向对象,三大特性是什么?什么区别?

封装(属性私有,方法公有),继承,多态(父类引用指向子类对象)

23.变长数组ArrayBuffer的系列问题
var c = new ArrayBuffer[Int]();
//1. 在尾部添加一个元素
	c+=2
//2. 在尾部添加多个元素
   c+=(3,4,5)
//3. 追加集合
	c++=Array(7,8,9)
//4. 指定位置添加元素
	c.insert(3,33)//在下标3的后面添加33
//5. 移除尾部n个元素
	c.trimEnd(n)
//6. 移除开头n个元素
	c.trimStart(n)
//7. 移除某个位置的元素
	c.remove(n)
//8. 移除从下标为n开始(包括n)的count个元素
	c.remove(n,count)
//9. ArrayBuffer 转 Array
	c.toArray
//10. Array 转 ArrayBuffer
	c.ArrayBuffer
模式匹配
def judgeGrade(grade:String): Unit = {
    grade match {
      case "A" => println("Excellent...")
      case "B" => println("Good....")
      case "C" => println("Just so so....")
      case _ => println("You need to work harder....")
    }
  }

  def judgeGrade2(name:String, grade:String): Unit = {
    grade match {
      case "A" => println("Excellent...")
      case "B" => println("Good....")
      case "C" => println("Just so so....")
      case _ if name == "dove" => println(name + ", you are a good boy, but ...")
      case _ => println("You need to work harder....")
    }
  }


  def greeting(array:Array[String]): Unit = {
    array match {
        // dove开头的且只有一个元素
      case Array("dove") => println("Hi: 奶总")
        // 2个任意的元素
      case Array(x,y) => println("Hello:" + x + "," + y)
        // xiaoweiba开头的任意多个元素
      case Array("xiaoweiba",_*) => println("Hello: zhangsan and other...")
      case _ => println("Hi: everybody....")
    }
  }

  def greeting(list: List[String]): Unit = {
    list match { // list = head + tail
      case "dove"::Nil => println("Hi: 奶总")
      case x::y::Nil => println("Hi:" + x + " , " + y)
      case "dove"::tail => println("Hi:奶总 and other friends...")
      case _ => println("Hi: everybody...")
    }
  }
  def matchType(obj:Any): Unit = {
    obj match {
      case x:Int => println("int")
      case s:String => println("string")
      case m:Map[_,_] => m.foreach(println)
      case _ => println("other type")
    }
  }

  def judgeIdentify(person: Person): Unit = {
    person match {
      case CTO(name, floor) =>println("cto")
      case Employee(name, floor) =>println("Employee")
      case _ => println("other")
    }
  }

  val inputs = Array(CheckTimeOutTask, HeartBeat(10000), SubmitTask("001","task001"))

  inputs(Random.nextInt(inputs.length)) match {
    case SubmitTask(id, name) => {
      println("SubmitTask: " + id + " , " + name)
    }
    case HeartBeat(time) => {
      println("HeartBeat:" + time)
    }
    case CheckTimeOutTask => {
      println("CheckTimeOutTask")
    }
  }
异常处理
  // IO常见处理步骤
  try {
    // 1) open file
    // 2)  use file
    val i = 1/0
  } catch {
    case e:ArithmeticException => println("除数不能为0...")
    case e:Exception => println(e.getMessage)
  } finally {
    // io file
    println("finally.....")  // 是肯定执行的,通常用于做资源的释放使用
  }
主构造器与附属构造器
//主构造器
//如果name不用val或var修饰,则在类外无法访问
class Person(val name:String,age:Int){

  //私有变量。只能在类中访问
  private[this] var sal:Int = _
  //附属构造器,全部this命名,并且必须调用主构造器或者其他附属构造器
  def this(name:String,age:Int){
    this(name,age)
    this.sal  = 10000
  }
/**
  * 子类构造方法触发之前要先触发其父类的构造方法
  *
  * 父类中已有的字段就不需要使用val/var修饰
  */
class Student(name: String, age: Int, var major: String)
  extends Person(name, age) {

  println("Student constructor enter...")
 
 //重写
  override val school = "peking"
  override def toString = "this is Student toString"

  println("Student constructor leave...")
}


可变集合与不可变集合

不可变 scala.collection.immutable
可变 scala.collection.mutable

List

Nil 是一个空List

//新建
 var a = List(1,2,3,4,5,6)
 //追加 
 a = 0 :: a //a: List[Int] = List(0, 1, 2, 3, 4, 5, 6)
 //拼接
 a = a:::List(7,8,9) //a: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
 //删除
 //a.remove(1)  //报错
 val b =  scala.collection.mutable.ListBuffer(1,2,3,4,5)
 b.remove(1)
Map
//新建
val map = Map[String,Int]()
//追加
// map += ('c'->3)::map 报错,默认不可变
val map2 = scala.collection.mutable.Map[String,Int]()
map2 += ("c"->1)

//遍历
  for((key,value) <- map2 ) {
    println(key + " : " + value)
  }

  for(key <- map2.keySet){
    println(key + " : " + map2.getOrElse(key, 0))
  }

  for(value <- map2.values) {
    println(value)
  }

  for((key,_) <- map2) {
    println(key + " : " + map2.getOrElse(key, 0))
  }
高级函数
  • map
scala> val list = List(1,2,3,4,5)
list: List[Int] = List(1, 2, 3, 4, 5)

scala> list.map(x=>x+2)
res15: List[Int] = List(3, 4, 5, 6, 7)

scala> list.map(_+2)
res17: List[Int] = List(3, 4, 5, 6, 7)

scala> val list = List(List(1,2),List(2,3),List(3,4))
scala> list.map(x=>x.map(y=>y+2))
res29: List[List[Int]] = List(List(3, 4), List(4, 5), List(5, 6))

scala> list.map(_.map(_+2))
res25: List[List[Int]] = List(List(3, 4), List(4, 5), List(5, 6))
  • flatMap
scala> val list = List(List(1,2),List(2,3),List(3,4))
//扁平化
scala> list.flatMap(x=>x.map(y=>y+2))
res27: List[Int] = List(3, 4, 4, 5, 5, 6)
  • reduce
scala> val list = List(1,2,3,4,5,6)
list: List[Int] = List(1, 2, 3, 4, 5, 6)

scala> list.reduce((x,y)=>x+y)
res37: Int = 21

scala> list.reduce((x,y)=>{
     | println(x+","+y)
     | x+y
     | })
1,2
3,3
6,4
10,5
15,6
res39: Int = 21

scala> list.reduce(_+_)
res40: Int = 21
伴生类与伴生对象
/**
*
*
*/
object Person extends App {
  def apply: Person = {
    println("object apply....")
    new Person()
  }

  //调用object的apply方法
  Person.apply
  //调用class的apply方法
  new Person().apply
}


class Person {
  def apply: Person = {
    println("class apply.....")
    new Person()
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值