1、运算符也是方法
2、既能面向又能面向对象的语言,自己自带许多包也可以通过import使用java的所
有包。scala是函数式编程。
3、没有a++操作
4、import scala.math._
Array(1,2,3) //内部使用的是apply方法实现的
-------------------------------------------------------------
apply()方法用来产生object对象,直接Array不用new(内部使用的是Array.apply())
_____________________________________________________________
val array = Array.apply (1,2,3),spark中也是使用apply()进行实例构造
val age = 19
if(age >= 18) "adult" else "child" //scala中不会返回结果
result
//当然可以使用new去创建数组
val arr = new Array[Int](5) //[Int]表示内部元素的类型,和java的泛型一样 //ArrayBuffer同样适用
5、在命令行输入多条语句用{}6、块表达式中,最后一行会作为整个块的默认返回值
7、占位符的使用:
printf ("%s is the future of the Big Data Computation Framework.
\n","Spark");
输出结果:Spark is the future of the Big Data Computation Framework.
//输出
8、readline("Please enter your password:") //readInt//读取命令台中的一行,输入
9、spark里RDD的数据都是不可变的
10、可变变量二次赋值就可改变变量值
11、Int类型本身没有Range()方法,但是其父类Integer有。scala中有隐式转换功
能,在int类型调用to()方法时,编译器会先将int转换为其父类Integer,然后调
用父类的Range()方法
12、import scala.util.control.Breaks._
13、定义函数
def f(param1:String,param2:Int = 30) = param1+param2
参数位置互换,等式值随参数名改变而不是随参数位置改变
14、增强for循环(可以遍历一个数组或者一个Range)
for(element <- numbers)(提取)
——————————————
def sum(numbers:Int*) = {var result = 0;for}
*表示numbers数组里元素个数不确定
15、sum(1 to 100) //这种语法是错误的,sum()方法里的参数要求是Int类型的
,而这样传入的是一个范围Range
sum(1 to 100: *_) //这种语法是正确的而且特别常见, _*表示把里边的元
素提取出来
16、函数定义有过程和结果之分
//Unit是个过程,不显示结果
def morning(content:morning):Unit = "good" + content
//结果函数
def morning(content:morning) = "good" + content
def morning(content:morning) {println("good" + content)}
17、//lazy函数的使用,只有被第一次使用时才被调用
lazy val content = formFile("/root/usr") //返回一个迭代器,mkString转换为字符串形式
18、for循环 //until控制循环条件
val n = 10
def f1:Int = {
for(i <- 1 to 20){
if(i == n) return 9
println(i)
i
}
}
for(i <- 1 util (arr2.length,2)) println(arr2(i)) //只打印arr2中偶数位置上的元素,下标从0开始。其中1表示从1这个位 置开始,2表示每隔两个元素打印一次(指定的起始位置最先打印)。
for(i <- (0 util arr2.length).reverse) println(arr2(i)) //数组元素反转
19、scala的try-catchimport java.io.FileNotFoundException
try{
val content = fromFile("/root/usr/aa.txt").mkString
}catch{
case _:FileNotFoundExceptio => println("Opps!!!File not found")
}finally{
println("ByeBye!!!")
}//scala中finally是必写的,出现异常时用来关闭数据库或者网络资源
——————————————————————对数组的基本操作—————————————————————
20、import scala.collection.mutable.Array
//引入集合中的可变数组
21、ArrayBuffer插入数据
val arrBuffer = ArrayBuffer[Int]() //定义创建对象arrBuffer
arrBuffer += 10 //定义数组长度
arrBuffer += (11,9,2,3) //向arrBuffer中插入数据
arrBuffer ++= Array(1,2,3) //arrBuffer后边追加一个数组
arrBuffer.trimEnd(3) //截掉arrBuffer的后三个元素
arrBuffer.insert(5,100) //在arrBuffer的第五个位置增加100这个元素,remove方法和insert是互逆操作, remove(5)表示删除第五个位置的元素;remove(5,3)删除从第五个位置开始的3个元素
arrBuffer.toArray() //转化为Array数组,也可以val数组转化为arrBuffer
22、对数组进行快速排序
scala.util.Sorting.quickSort(arr2)
23、将数组转化为字符串,以“,”间隔
arr2.mkString(",")
24、i*i
yield(生产) i*i //生成另一个集合
25、arr2.filter(_%3==0).map(i => i*i) //_表示每次只取arr2中的一个元素,不用在后添加*号。取多个时应添加*号。 map本身是函数,又传入函数,称为高阶函数。式子中的()可以用{}代替
相当于val arr3 = for(i <- arr2 if i % 3 ==0) yield i*i
————————————————————————对Map的基本操作———————————————————
26、map的使用(map是不可变的,不能添加或者删除元素)
val persons = Map("Spark" -> 6,"Hadoop" -> 11)
Persons("Hadoop")
当有增删得需求时,可以
val persons = scala.collection.mutable.Map("Spark" -> 6,"Hadoop" -> 11)
这样就可以进行操作了
persons += ("Flink" -> 5)
***********************************
判断有没有map中的key
persons.contains("Spark")
***********************************
val sparkKValue = if (persons.contains("Spark")) persons("Spark") else 1000
相当于scala中的
val sparkKValue = persons.getOrElse("Spark",1000)
27、 map的增强型for循环的使用
for((key,value) <- persons) println(key + ":" + value) //这里的(key,value)就是一个Tuple,后边详细讲
只访问key
for(key <- persons.keySet) println(key)
28、声明SortedMap
val persons = scala.collection.immutable.SortedMap("Spark" -> 6,"Hadoop" -> 11)
———————————————————————————————————————————————————
29、Tuple就是一个元组,里边有很多不同类型的数据。和数组不一样,下标从1开始,spark中就有大量tuple的应用
val tuple = ("Spark",6,99.0)
tuple._1
——————————————————————————————————————————————
30、结合spark源码看scala
SparkContext
**************************************************************************************************************************
函数式编程语言中变量和函数地位等值,变量可以作为函数的参数传入函数,函数也可以作为参数传入函数
*************************************************************************************************************************