首先得在windows安装scala以及在idea上配置scala插件,可参考 scala安装 scala简介 Scala源自Java,Scala构建在JVM之上,Scala与Java兼容、互通 Scala的优势 多范式编程:面向对象编程、函数式编程 表达能力强,代码精简
大数据与Scala Spark采用Scala语言设计 提供的API更加优雅 基于JVM的语言更融入Hadoop生态圈
Scala概述 面向对象特性 每个值都是对象 对象的数据类型和行为由类(Class)和特征(Trait,类似于interface)描述 利用特征实现混入式多重继承 函数式编程 每个函数都是一个值 支持高阶函数、柯里化(currying)、样例类(case class)及模式匹配…… Scala是静态类型语言 扩展性:隐式类、字符串插值
Scala变量与常量 变量:赋值后可以改变,在生命周期内可以多次赋值 var 变量名称:类型=值 或者 var 变量名称=值 常量:赋值后不可变,类似与Java中final变量 val 变量名称:类型=值 或者 val 变量名称=值 一般无需显示指定类型,Scala编译器会自动推断出类型
type关键字(不常用) type 类型别名=类型 Scala关键字列表 Scala数据类型 Scala和Java有着相同的原始数据类型 Scala数据类性层次结构 Any:所有类型的超类(顶级类型) AnyVal:表示值类型的超类 AnyRef:表示引用类型的超类,对应java.lang.Object Unit:表示无值,类似Java中的void Nothing:所有类型的子类 Null:表示null或空引用(null是Null类型的唯一实例)
字符串插值 s插值器:允许将变量引用、表达式直接插入字面字符中
val name="Tom" println(s"Hello,$name") //Hello,Tom println(s"1+1=${1+1}") //1+1=2f插值器
val h=1.9d val name="Tom" println(f"$name%s is $h%2.2f meters tall") 2.2f中,前一个2指的是h输出的字符串总长度为2, 后面一个2指的小数点后位数,当规定的总长度 (在这里是2,不存在这种可能)大于整个字符串长度时候, 在字符串前面会用空格进行替代raw插值器
s"a\nb" //将输出换行 a b raw "a\nb" //输出原始字符 a\nbScala条件控制(类Java) if语句
val x=10 if(x>0){ print("x大于0") }if else语句
val x=10 if(x>10){ print("x大于10") }else if(x==10){ print("x等于10") }else{print("x小于10")}Scala条件语句返回值 Scala任何表达式都有返回值
val x=10 val y=if(x==10) x+1 else x //单行表达式可以省略{} //y=11代码块也是表达式,返回值为最后一个表达式结果
val x=10 val y={ print("我是代码块") x+1 } //我是代码块y:Int=11 val y={ x+1;print("我是代码块") //多个表达式使用“;”分隔 } //我是代码块y:Unit=()Scala循环控制(类Java) while循环
//while循环 var num: Int = 0; while ( num < 100 ) { println( num ); num = num + 1; } //do while循环 var num: Int = 0; do { println( num ); num = num + 1; } while ( num < 100 }for循环
// to和until的区别在于to可以取到num,until不可以 val num:Int = 10; for ( i: Int <- 1 to(until) num ) { println( i * 100 ); }中断
val num:Int = 10; for ( i: Int <- 1 to num by 2 ) { if(i>=5) break; println( i ); }//1,3 by 2表示每次i的数字加2,而不是1,如果后面的数子数负数,则表示减,比如 for (i<- 10 to 1 by -2){ println(i) }//10,8,6,4,2for循环过滤
val num:Int = 10; for ( i: Int <- 1 to num; if i%2==0;if i>5 ) if后面就是循环筛选条件 { println( i ); }//6,8,10for循环返回值 for 循环中的 yield 会把当前的元素记下来,保存在集合中,循环结束后将返回该集合。也称for推导式
val num:Int = 10; //for循环使用yield将具有返回值 var retVal=for ( i: Int <- 1 to num; if i%2==0;if i>5 ) yield i; for(a<-retVal){ println(a); }//输出6 8 10Scala数组 存储固定大小的元素 数组索引从0开始
//数组创建方式一 var a1:Array[String] = new Array[String](3) a1(0)="Jason" a1(1)="Marie" a1(2)="Jimmy" //数组创建方式二 var a2=Array("Jason","Marie","Jimmy") //数据创建方式三:区间数组 var a3=Array.range(1,10,2) 范围1-10,步长为2 //结果为1,3,5,7,9Scala元祖 可以包含不同类型的元素 最多支持22个元素 (Tuple1~Tuple22) 使用下划线“_"访问元素,“_1"表示第一个元素
//元组声明方式一 var tp1 = ("Mike", "123 ABC street", 58) println(tp1._1) println(tp1._2) println(tp1._3) //迭代元组 tp1.productIterator.foreach{ i =>println("Value = " + i )} //结果 Value:Mike Value:123 ABC street Value:58 //元组声明方式二 var tp2 = new Tuple3("Mike", "123 ABC street", 58) //元组声明方式三 def mike = "Mike" -> 5 def mike = "Mike" -> 5 -> 6 //结果 (Mike,5) ((Mike,5),6) 依旧是二元组,以套的方式存在 //输出scala.Tuple2 mike.getClass //将元组元素依次赋给三个变量 val(name, address, age) = tp1 println(name) println(address) println(age)Scala Map 常用操作
var m = Map[String, Int]("a"->1, "b"->2, "c"->3, "d"->4, "e"->5, "f"->6, "g"->7, "h"->8, "i"->9) m("a") //1 m += ("j"->0) //(e -> 5, j -> 0, f -> 6, a -> 1, i -> 9, b -> 2, g -> 7, c -> 3, h -> 8, d -> 4) m += ("j"->11) //(e -> 5, j -> 11, f -> 6, a -> 1, i -> 9, b -> 2, g -> 7, c -> 3, h -> 8, d -> 4) var n = m ++ Map[String, Int]("a"->3, "j"->99) //(e -> 5, j -> 99, f -> 6, a -> 3, i -> 9, b -> 2, g -> 7, c -> 3, h -> 8, d -> 4) n -= ("g", "e") //(f -> 6, a -> 3, i -> 9, b -> 2, g -> 7, c -> 3, h -> 8, d -> 4)使用Scala实现WordCount
val stringList=List("hello world hello gree","hello java hello scala","hello wenwen hello kb09") stringList.flatMap(x=>x.split(" ")).map(x=>(x,1)).groupBy(x=>x._1).map(x=>(x._1,x._2.size)) //(kb09 -> 1, wenwen -> 1, world -> 1, java -> 1, scala -> 1, gree -> 1, hello -> 6)