spark笔记3

scala入门

1. 基础语法

  • 标识符区分大小写
  • class 名称首字母需大写
  • 方法名称首字母需小写
  • 程序文件名称需与 object 名称相同
  • main 方法是 Scala 程序的入口,每个 Scala 程序都必须定义此方法。
  • 标识符
    在 Scala 中标识符只能包括字符、数字和下划线,并且只能以字符和下划线开头,如:name、_value、test_1等等。
  • 混合标识符
    混合标识符由一个字符数字标识符、下划线和一个运算标识符组成,比如:unary_+、var_=。在这里,unary_+定义了一个一元+运算符,myvar_=用来作为方法名称定义了一个赋值运算符。
  • 文字标识符
    用``符号包含任意字符都是文字标识符

2. 数据类型

类型与java相同,占用的内存空间和精度也都一样
但是目测在java里面是没有这些的

类型 描述
Unit 表示没有值
Null 空或空引用
Nothing 每一个其他类型的子类型,包括无值
Any 任何类型的超类型,任何 object 都是 Any 类型的
AnyRef 任何引用类型的超类型
  • 变量和常量
    var声明变量,使用val声明值(也就是常量)

3. 函数定义和使用

一般定义

函数通过def定义,在 Scala 中,需要为函数参数指定类型签名,具体的格式如下

def functionName ([list of parameters]) : [return type] = {
   function body
   return [expr]
}

无参函数

如果函数不带参数,调用的时候可以不写括号,函数体中的语句如果只有一条表达式,可以省略函数的大括号
记录一下操作过程

  • 函数的部分应用
    这是用下划线来实现的,是一个和以往学过的语言很不一样的一个特点

你可以使用下划线_部分应用一个函数,结果将得到另一个函数。Scala使用下划线表示不同上下文中的不同事物,你通常可以把它看作是一个没有命名的神奇通配符。在{ _ + 2 }的上下文中,它代表一个匿名参数。你可以部分应用参数列表中的任意参数,而不仅仅是最后一个。你可以这样使用它

def add(x: Int, y: Int) :Int = {
    return x + y
}
var add1 = add(1, _:Int)
var add2 = add1(2)
println(add2)

效果是这样的,第一次调用add的时候后面那个参数用下划线来替代掉了

柯西化函数

现在我理解这个就是说这个有多个括号,每个括号里面是一个参数和其类型注解

可变长度参数

同一个类型的函数参数,个数是可变的,至少一个
这个例子是把输入的单词变成大写

// 把所有单词改为首字母大写
def capitalizeAll(args: String*) = {
    args.map { arg =>
        arg.capitalize
    }
}
var str = capitalizeAll("hello", "world")
println(str)

4. 类

在类中用def定义方法用val定义字段值

类的构造方法

这个课里面讲的构造函数,应该就是在实例化对象的时候给类方法传递参数,和java不一样的是类体里面不需要指明一个名字是类名的方法
这是一个展示scala“面向表达式”的例子,对color的blue、black、white的赋值都是绑定在表达式上面的

class Calculator(brand: String) {
    /**
     * 一个构造函数
     */
    val color: String = if (brand == "shiyanlou") {
        "blue"
    } else if (brand == "hello") {
        "black"
    } else {
        "white"
    }

    // 实例方法
    def add(m: Int, n: Int): Int = m + n
}

类的继承

继承的关键字和java一样也是extends但是后面接的父类名字后面是带括号的

方法重载

上面那个科学计算器类,里面的log方法,在下面的这个例子里面被重载
试了原来的color属性,双参数的log方法,以及新的重载的那个方法

抽象类的继承

5. 特质

特质(Traits)是一些字段和行为的集合,可以扩展或混入(mixin)你的类中。不同于类继承,class 可以扩展多个 Traits。
通过 with 关键字,一个类可以扩展多个特质

但是让一个类拥有特质的办法还是extends,只不过extends后面可以加多个特质
几个特质之间要用with来连接

6. 集合

Scala 提供了丰富的集合库,包括:列表(List)、集合(Set)、映射(Map)、选项(Option)、元组(Tuple)

set和list的话,最直观的结果是这样的

而immutable的意思是永恒不变的,但是并不能帮助我在字面意思上理解set和list的不同,还是等具体实践操作吧
map映射的话,是这样用的

用括号括起来就是元组,不禁让人联想起来数据库里面关系模式什么的

选项option的话我理解这个字面是什么意思,但是没有搞清楚这个操作是在干什么

查了人家的博客,好像是说,Scala鼓励你在变量和函数返回值可能不会引用任何值的时候使用Option类型。
在没有值的时候,使用None,这是Option的一个子类。如果有值可以引用,就使用Some来包含这个值。
Some也是Option的子类

Option类型的值通常作为Scala集合类型(List,Map等)操作的返回类型。比如Map的get方法。Option有两个子类别,Some和None。当程序回传Some的时候,代表这个函式成功地给了你一个String,而你可以透过get()函数拿到那个String,如果程序返回的是None,则代表没有字符串可以给你

参考资料

Scala 技术笔记之 Option Some None

posted @ 2019-12-27 15:20  ltl0501  阅读(182)  评论(0编辑  收藏  举报