scala中的函数一些用法
- trim 开头和结尾的空白忽略
- map 对每一条输入进行指定的操作,然后为每一条输入返回一个对象
- filter 过了
scala 特殊符号用法
- ::: 三个冒号运算符(list的连接操作)
- :: 两个冒号运算符:表示普通元素与list的连接操作
- _N下划线数字运算符:用于访问元组的第N个元素,N的取值从1开始(元组的元素类型可以不同。)
- <- 用于遍历集合对象
- => 匿名函数
- Int => String表示函数输入为Int型,返回String型,同Function(Int,String) () => T表示函数没有输入参数,但返回T
scala中下划线含义
- _ 下划线 有很多含义
1.通配符
2.匿名函数
3.指代集合中的每一个元素。例如筛选列表中大于某个值的元素
4.使用模式匹配可以用来获取元组的组员。
val m = Map(1 -> 2,2 -> 4) for ((k,) <- m) println(k)
//只取key,因此在value处用_
5.:_* 作为一个整体,告诉编译器你希望将某个参数当作数序列处理。
6.+=:为map类型变量添加元素 -=:为map类型变量移除元素及其对应的值
小括号与大括号
- scala中函数的小括号,可以用花括号来表示,即foo{xx} 与 foo(xx)是一回事儿。
- 对于只有一个参数的方法,其小括号是可以省略的,map(lambda)可写为 map lambda,即这块{case 2 => “OK”}连同花括号整体是一个lambda(函数字面量)。
// map方法这样写不能编译通过
scala> List(2).map( case 2 => “OK” )
// 换做花括号就可以了
scala> List(2).map{ case 2 => “OK” }
Option[T]
- 用 Option[T] 来避免 NullPointerException
- Option有两个子类别,Some和None。当程序回传Some的时候,代表这个函式成功地给了你一个String,而你可以透过get()函数拿到那个String,如果程序返回的是None,则代表没有字符串可以给你。
reduceLeft 和 reduce
- reduceLeft 和 reduceRight 我们可以强制处理元素的方向。(使用 reduce 方向是不被保证的)
函数
函数和方法一般用def定义;也可以用val定义匿名函数,或者定义函数别名。
def m0(x:Int) = x*x
val m1 = (x:Int)=> x*x // 用(), ()是必须的
val m2 = {x:Int=> x*x} // 用{}, {}是必须的不需要返回值的函数,可以使用def f() {…},永远返回Unit(即使使用了return),即:
def f() {…} 等价于 def f():Unit = {…}需要返回值的函数,用 def f() = {…} 或者 def f = {…}
对象的无参数方法的调用,可以省略.和()
“hello world” toUpperCase // “HELLO WORLD”
匿名函数 ((命名参数列表)=>函数实现)(参数列表)
1.无参数: (()=>函数实现)()
2.有一个参数且在最后: (函数实现)(参数)
3.无返回值: ((命名参数列表)=>Unit)(参数列表)
spark 性能小技巧
- collect() 通常在单元测试中使用.只有当你的整个数据集能在单台机器的内存中放得下时,才能使用collect(),因此,collect() 不能用在大规模数据集上。
- distinct() 操作的开销很大,因为它需要将所有数据通过网络进行混洗(shuffle)
偏函数
- 偏函数:当函数有多个参数,而在使用该函数时不想提供所有参数(比如函数有3个参数),只提供0~2个参数,此时得到的函数便是偏函数。