天天看点

Scala学习笔记

1、for循环格式

for(i <- 1 to 10){print(i)}

2、懒加载 lazy val a = 1; 直到用时才会加载

3、方法的声明格式 def(x:Int,y:Int) : Int ={} 最后一个冒号后面是返回类型,不加则没有返回值

4、默认参数 def loadConf(conf : String = "default"){ print(conf)} 如果不传入参数 ,则默认使用default的数值

5、变长参数 def sun(elems: Int*){ } 可以传入 更多的参数

6、异常处理 scala 使用了模式匹配

try{

}catch{

case e: Exception => System.err.print(e)

case_ => //should never happen

}finally {

}

7、定长数组 val array_name = new Array[String](5),也可以 val a = Array("Jack","Lucy") 直接指定String类型的初始化值

8、变长数组 val a = scala.collection.mutable.ArrayBuffer[Int]() a+=1 a+=2 a+=(3,4,5) a++= Array(6,7,8) 就可以将数值甚至数组加入数组

也可以使用insert a.insert(num) , a.remove(num); a.toArray 就是将变长数组变成定长数组 然后再可调用sum max min 等#

a.trimEnd(num) 可以将后num个数去掉

9、遍历数组

val a = Array(1, 2, 3, 4, 5, 6, 7, 8)

for (elem <- a) {

println(elem)

}

for(i <- 0 until a.length){

print(a(i))

10、Map(可变和不可变)

val age = Map("Jack" -> 20,"Lucy" -> 18)

//获取key为Jack的值age("Jack")

//倘若不存在,则会报错,所以用 age.getOrElse("Jack",0) 如果不存在,则默认赋予一个值 或者使用age.get("Jack") 不过如果不存在值,获取的为null

//插入元素可以使用 age("aa") = 2 则会将key为aa,值为2的值插入age的Map中 age += ("BB" ->3,"CC" ->4) 删除 直接 age -="AA"

//迭代map

val m = Map("jack" -> 20,"BB"-> 3,"CC" -> 4,"Lucy" ->18)

for((k,v) <- m){

println("key is" + k + ",value is " + v)

//只获取key的集合 m.keySet 只获取value的集合 m.values

11、元祖 val a = (1,3,4,5,6,8) 访问方式 下标从1开始。 a._1 就表示第一个元素

Scala面向对象

object Basic2 {

def main(args : Array[String]){

val p = new Person //没有参数的对象 可以不加()

p.name = "Jack"

println(p.name +":"+p.age)

val p = new Person("Jacky",20,"male")

print(p.name +":" + p.age + ":" + p.gender)

}

class Person{

var name : String = _ //没有参数 会自动生成getter和setter方法

val age = 10 //这种只会生成getter方法

//主构造器 直接跟在类名后面,朱构造器中的参数,最后会被编译成字段。

//朱构造器执行的时候,会执行类中的所有语句

//假设参数声明时不带val和var,那么相当于private[this]

val p = new Person("Jacky",20)

print(p.name +":" + p.age)

class Person(val name:String,val age :Int){

println("this is the primary constructor!")

var gender : String = _

//附属构造器名称为this,每一个附属构造器必须先调用已经存在的子构造器或者附属构造器

def this(name : String,age : Int,gender : String){

this(name,age)

this.gender = gender

抽象类

trait 接口中可以写实现类

trait ConsoleLogger{

def log(msg : String): Unit ={

println("save money:" + msg)

trait MessageLogger extends ConsoleLogger{

override def log(msg : String): Unit ={

println("save money to bank" + msg)

abstract class Account{

def save

class MyAcount extends Account with ConsoleLogger{

def save: Unit ={

log("100")

Apply 静态的方法可以定义一个object 就为静态方法 Scala中没有static关键字

class ApplyTest {

def apply() = "APPLY"

def test: Unit ={

println("test")

object ApplyTest{

def static: Unit ={

print("i'm a static method")

def apply() = new ApplyTest

object Basic4 extends App{

//ApplyTest.static

//在调用ApplyTest的时候 已经new了

val a = ApplyTest()

//调用的是 object的方法

a.test

val t = new ApplyTest

//调用的是类的apply方法

print(t())

模式匹配

val value = 1

val result = value match{

case 1 => "one"

case 2 => "two"

// _代表了通配符 所以不需要break

case _=> "some other number"

println("result of match is :" + result)

val result2 = value match{

case i if i==1 =>"one"

case i if i==2 =>"two"

case _ => "some other number"

文件读取

val file = Source.fromFile("/usr/local/yangsiyi.txt")

for(line <- file.getLines()){

println(line)

获取网络内容 适用于爬虫

val file1 = Source.fromURI("http://www.baidu.com")

这种方式是按字符打印

for(c <- file){

println(c)

字符串追加

val a = "Yes"

s"$a, I Do !"

print(s"$a, I Do !")

private[Spark] 表示只能在此包里面访问

继续阅读