scala编程语言
作者:Martin OrderSky也是jvm开发团队的核心成员之一,是java得泛型作者
scala 也是运行在 jvm上的编程语言
scala兼容原有的java程序scal是纯面向对象的,一皆对象
在idea编程工具中书写scala代码时需要注意以下两点
1、管理上的
2、main得写法
scala的变量的定义
在scala中有关键字var ,val定义变量
var表示可变参数
val表示不可变参数
在scala中没有基本类型的参数,全部都是引用类型的参数
int----->Int
long------->Long
变量定义 例如:
val abc:String="abc"
val aa:Int=112
var bb:Int=12
在scala中还有自动类型推断例如
var nn=19
val as="asda"
scala 中的数据类型
Any是scala中所有类型的父类等同于java中的Object
Any有两个直接子类 :AnyRef是所有的引用数据类型AnyVal是所有的值类型、
AnyRef所有引用类型的父类,等同于java中的object类型
AnyVal所有值类型的父类
Nothing: scala体系中的所有类型的子类
Null :所有引用类型的子类,单例对象,只有一个实例:null
String类型的父类:AnyRef
面向对象的思想发挥出来
空: Null Nothing None Nil Unit
val list:List = Nil
val a:Null = null
val b:Unit = ()
在scala中没有自动类型提升只有隐式转换但两者的功能是一样的
在scala中
ne eq 就相当于java中的== , 默认情况下,用来比较引用类型的地址是否一样ne和eq是相反的
== equals 用来比较值 是否一样
简言之,equals方法是检查值是否相等,而eq方法检查的是引用是否相等。所以如果比较的对象是null那么==调用的是eq,不是null的情况调用的是equals。
流程控制
if
var a=if(3>4) "a"
var a=if(3>4) "a" else "s"
var result = if(condition) statement1 else if statement2 else statement3
能用在很多比较特殊的场合: 守卫条件
闭包
作用:在函数的外部访问一个函数内部的局部变量
数组
var array=Array[Int]
scala的数组 数组的定义 基础理论
变长数组: 可以增删元素 ArrayBuffer
定长数组: 不能增删元素 Array
int[] Array
add insert remove
scala的数组不一样:
可以定义定长的数组,那么久和java中的数组一样
也可以
定义变长的数组,那么就等同于java中的list, 你可以这么理解
创建
定义变长数组:
val ab = new ArrayBuffer[Int]()
定义定长数组:
val array1 = Array[Int](1,2,3,4) 不使用new的方式
没有显示的使用new,不代表没有使用,
而是被封装了
被封装在apply方法中
val array2 = new Array[String](length) 使用new的方式
new关键字的作用:在底层就是调用构造器
定长数组和变长数组的转换
ab.toArray() 变长 ==> 定长
ab.toBuffer() 定长 ==> 变长
按照位置 设置值 访问值
访问值:ab(2)
修改值:ab(2) = 33
增删改查元素
变长数组来说:
1、添加元素
追加
ab += 3
ab += (4,5)
ab ++= Array(6,7)
插入
ab.insert(4, 55, 66, 77)
2、删
ab -= 33
ab.remove(2)
3、改查 和 定长数组一致
遍历
for(num <- ab) println(num)
for(index <- 0 to (ab.length -1 )) println(ab(index))
for(index <- 0 until ab.length) println(ab(index))
数组中的常用操作
1、map
映射:你给我一个元素,我按照某种逻辑把它变成另外一个元素返回
2、reduce
简单题目:
尝试求一下array的平均值
尝试求一下array的平均值
尝试求一下array的平均值
array.sum / array.length
3、filter
筛子
打米 稻谷 --> 米
4、count
计数
5、sort
排序
sortBy
sortWith
sorted
array.map(line => line.split(" ")).flatten.map(word => (word,1)).groupBy(wt => wt._1).map(x => (x._1, x._2.length)).toList.sortWith((x, y) => x._2 > y._2)
高维数组
java中的二维数组:
int[][] aa = new int[3][4];
aa[0] = 长度为4的一个数组
int[][][] bb = new int[3][4][5];
bb[0] = new int[4][5]
高维数组:把n维数组看做是一个一维数组的话
那么就是说,每个位置上的元素就是一个n-1维的数组
scala中的高维数组:
val abc = Array(1,2,3)
val array = Array(Array(1,2), Array(3,4))
val array2 = Array(Array(Array("a","b"),Array("a","b234")), Array(Array("a","b"),Array("a","b")))
访问:array2(0)(1)(1)
```
package spark.com.test.zuoye
object Demo {
class a{
var a:Int=_
}
def main(args: Array[String]): Unit = {
var arr=Array[Int](1,2,3,4,5,6,7,8,9,10)
//遍历根据下标访问
//for(index <- 0 to (arr.length - 1)) println(arr(index))
//for(index <- 0 until arr.length ) println(arr(index))
//直接枚举
//for(a<-arr){println(a)}
// 遍历所有的奇数
//for(index <- 0 until arr.length if index % 2 == 0 ) println(arr(index))
//如果index % 2 == 0(守卫条件)表达式为真,则执行println(arr(index))
//否则不执行
// 隔着3个数字
// for(index <- 0 until (arr.length , 3)) println(arr(index))
// while 的写法和java中的一模一样
// while 和java一样,++ -- 这种语法不支持, -= +=
// continue break 也和java一模一样
var count:Int = 10;
var sum:Int = 0
while(count > 0){
sum += count;
count -= 1; // count--; 但是不行,scala中没有 ++ -- 这种语法
}
print(sum)
}
}
```
方法和函数
定义一个计算逻辑:把两个int类型的数值相加
方法的定义和使用
def sum(a:Int,b:Int):Int=a+b
val result=sum(2,3)
函数的定义和使用 val
定义一个函数就相当于定义一个变量
val sum:(Int,Int)=>Int=(x.,y)=>x+y
val sum=(x:int,y:Int)=>x+y
val result=sum(1,2)
高阶函数
1、函数可以作为方法得参数
2、函索可以作为方法的返回值
一般来说:方法的参数和返回值都是一个普通的变量
val var