scala中的函数、变量、集合、对象---scala学习笔记(1)

来源:互联网 发布:微信服务号 域名备案 编辑:程序博客网 时间:2024/05/01 00:06

最近正在尝试接触spark,那么不可避免地就要用到scala,虽然spark同时也支持java,但是通过阅读spark上的例程上发现,往往scala的代码相比较java而言更加简短,而且也更加清晰。所以决定试一试简单地学习一下scala。
使用的书籍是《Scala编程》,篇幅不长但是力在突出Scala自身的特性而且对Java和scala做了比较。
1.变量的定义
scala一共就两种变量,一种是var,另一种是val。前者在生命周期中可以被赋值多次,后者在初始化之后便不可再被赋值。val类似于Java中的final型变量。看起来是特殊的变量,但是在函数式编程中常使用的是val而非var。尽量少使用var可以使得代码更加简洁。
2.函数的定义

def max(x:Int,y:Int):Int={    if(x>y)        x    else        y}

例如上面定义的一个函数,参数类表中冒号后面的是参数类型,参数列表后面紧跟着的冒号提示的是函数的返回类型。如果函数不返回任何有用的值,那么使用关键字Unit,或者直接不写冒号和之后的类型也可以:

def p()=println("Hello")

3.函数文本
Scala函数文本语法:

(x:Int,y:Int)=>x+y

右键头之前的是参数列表,箭头之后是函数体。又例如下面的语句可以打印每一行命令行参数:

args.foreach(arg=>println(arg))

也可以用for语句写成这样:

args.for(arg<-args)    println(arg)

注意变量arg是val类型的,不能在for的循环体中被重新赋值。
4.持有对象

  • Array

    可以用如下方法定义一个String类型的数组:

val str=new Array[String](2)

[]中的是数据类型,而()括号内的是定义长度
如果要对字符串赋值:

str(0)="Hello World"str(1)="!!\n"

如果要局部遍历Array:

for(i<-0 to 2)    print(str(i))

其中Scala吧’0’和’2’都看成对象,所以中间的to其实是对象(0)调用的方法,语句也可以写成

for(i<-(0).to(2))    print(str(i))

类似地其他运算符如’+’,’-‘实际上都是方法的调用
对于数组的初始化:

val numbers=Array(1,2,3)
  • List
    和Java中不一样的是Scala中的List不可变长的,没有append方法。
    有两种叠加的方法:
    第一种是’:::’,可以将两个List相互叠加:
val ListA=List(1,2)val ListB=List(3,4)val ListAB=ListA:::ListB

ListAB得到的就是ListA和ListB合并的新List
第二种是’::’,可以把新元素添加到List的最前端:

val ListC=(2,3)val ListD=1::ListC

ListD的元素就是(1,2,3)
可以用var定义List做到类似append的效果

    var listA=List(2,3,4)    listA=1::listA

最后将List调用reverse即可。
ListBuffer有append方法,最后调用toList()方法就可以转换成List了。

  • Set

    Set分为两种,一种是可变集,另一种是不可变集。两个都命名为Set,但是在两个不同的包下。
    scala.collection.mutable.Set和scala.collection.immutable.Set
    可变集加入新元素后直接返回自身,而不可变集加入新元素后会返回一个新构造出来的集合,那个集合加入了新的元素,自身并没有添加。

  • Tuple
    由于List和Array以及后面的Set存储的数据类型是不能改变的,所以有了Tuple,元组。其中可以同时拥有多种类型的元素
    例如可以直接这么定义和执行:
val tuples=(1,"train")print(tuples._1)print(tuples._2)
  • Map
    和Set一样,Map也分为可变映射和不可变映射,同样也是相同的命名,在不同包下。
    例如创造一个可变映射:
import scala.collection.mutable.Mapval CapitalMap=Map[String,String]()CapitalMap+=CapitalMap("China"->"Beijing")CapitalMap+=CapitalMap("United States"->"Washington")CapitalMap+=CapitalMap("France"->"Paris")

添加新的映射时都是对自己重新赋值
如果用不可变映射:

val CapitalMap=Map{"China"->"Beijing","United States"->"Washington","France"->"Paris"}

5.类和对象

  • 类的定义

Scala类和对象的概念与Java类似,如看到如下类:

class packet{   var money=0   def earn(cash:Int){money+=cash}   def cost(cash:Int){money-=cash}}

如果有两次实例化:

val a=new packetval b=new packet

在未对money进行再次赋值之前,两者指向的是同一个变量money.
注意,a是val类型的,则不可再次指向新的对象,但是可以改变其指向对象的字段money。
Scala中的默认访问权限是public

  • 分号的推断规则:

    分号推断的规则
    分割语句的精确规则非常有效却出人意料的简单。那就是,除非以下情况的一种成立,
    否则行尾被认为是一个分号:
    1.疑问行由一个不能合法作为语句结尾的字结束,如句点或中缀操作符。
    2.下一行开始于不能作为语句开始的字。
    3.行结束于括号 (…) 或方框 […] 内部,因为这些符号不可能容纳多个语句。


这里引用书中的原话。
  • 单例对象
    Scala特有的单例对象集成了同名类的所有静态成员,因为在Scala类中没有定义静态成员的手段。
    使用关键字Object创建单例对象:
Object packet{ var master="KATE" def setName(temp:String){master=KATE}}

单例对象也被称作是同名类的伴生对象。
不依附于任何类的单例对象称为孤立对象。
值得一提的是在写Scala程序时的程序入口点定义就可以用到孤立对象。


刚刚才开始学习scala,发现要开始在spark上写还是很有难度的啊,最多也是读懂一些例子,也不能深入到去写算法。

0 0
原创粉丝点击