赞
踩
Scala源自Java
Scala的优势
大数据与Scala
Spark采用Scala语言设计
提供的API更加优雅
基于JVM的语言更融入Hadoop生态圈
object HelloWorld {
def main(args: Array[String]): Unit = {
var a = "HelloWorld"
println(a)
}
}
//def:定义一个方法
//Unit:代表没有返回值
面向对象特性
函数式编程
Scala是静态类型语言
扩展性:隐式类、字符串插值
变量
var 变量名称:类型=xxx
//一般无需显示指定类型,Scala编译器会自动推断出类型
常量
val 常量名称:类型=xxx
定义多行字符串用三个双引号来表示分隔符,格式为:""" … “”"
var a ="""
我爱学习,
我爱Java,
我爱Scala
"""
type关键字
type 类型别名=类型
var 变量名称:类型别名=xxx
val 常量名称:类型别名=xxx
abstract | case | catch | class |
---|---|---|---|
def | do | else | extends |
false | final | finally | for |
forSome | if | implicit | import |
lazy | match | new | null |
object | overwrite | package | private |
protected | return | seailed | super |
this | throw | trait | try |
true | type | val | var |
while | with | yield | (空格) |
- | : | = | => |
<- | <: | <% | >: |
# | @ |
Scala与Java有着相同的原始数据类型
数据类型 | 描述 |
---|---|
Byte | 8位有符号整数。数值区间-128~127 |
Short | 16位有符号整数。数值区间-32768~32767 |
Int | 32位有符号整数。数值区间-2147483648 ~ 2147483647 |
Long | 64位有符号整数。数值区间-9223372036854775808 ~ 9223372036854775807 |
Float | 32位IEEE754单精度浮点数 |
Double | 64位IEEE754双精度浮点数 |
Char | 16位无符号Unicode字符。区间值为U+0000 ~ U+FFFF |
Boolean | true或false |
String | 等于java.lang.String |
s插值器:允许将变量引用、表达式直接插入字面字符中
val nam="James"
println(s"Hello,Sname")
//Hello,James
println(s"1+1=${1+1}")
//1+1=2
f值插值器
val height=1.9d
val name="James"
println(f"$name%s is $height%2.2f meters tall")
//%s:后面连接的字符串可以不加空格
//%2.2f:第一个2代表数值>=2不做变化,数值<2用空格补足,相差几就补足几个空格;第二个2代表保留两位小数
raw插值器
s"a\nb" //将输出换行符
raw"a\nb" //输出原始字符
val x=10
if(x>0){
print("x大于0")
}
Scala中换行等同于分号,所以分号可以省略
object test {
def main(args: Array[String]): Unit = {
val x=10
if(x>0){
print("x大于0")
}
}
}
输出结果:
val x=10
if(x>10){
print("x大于10")
}else{
print("x小于等于10")
}
object test {
def main(args: Array[String]): Unit = {
val x=10
if(x>10){
print("x大于10")
}else{
print("x小于等于10")
}
}
}
结果展示:
val x=10
if(x>10){
print("x大于10")
}else if(x==10){
print("x等于10")
}else{print("x小于10")
}
object test {
def main(args: Array[String]): Unit = {
val x=10
if(x>10){
print("x大于10")
}else if(x==10){
print("x等于10")
}else{print("x小于10")
}
}
}
结果展示:
val x=10
val y=if(x==10) x+1 else x //单行表达式可以省略{}
//y=?
object test {
def main(args: Array[String]): Unit = {
val x=10
val y=if(x==10) x+1 else x //单行表达式可以省略{}
println(y)
}
}
结果展示:
val x=10
val y={
print("我是代码块")
x+1
}
//y=11
val x=10
val y={
x+1;print("我是代码块")
}
//多个表达式使用“;”分隔
//y=?
var num: Int = 0;
while ( num < 100 ) {
println( num );
num = num + 1;
}
object test {
def main(args: Array[String]): Unit = {
var num: Int = 0;
while ( num < 100 ) {
println( num );
num = num + 1;
}
}
}
输出结果:
var num: Int = 0;
do {
println( num );
num = num + 5;
} while ( num < 200 )
object test {
def main(args: Array[String]): Unit = {
var num: Int = 0;
do {
println( num );
num = num + 5;
} while ( num < 200 )
}
}
结果展示:
val num:Int = 10;
for ( i: Int <- 1 to num )
{
println( i * 100 );
}
for { i: Int <- 1 until 100 }
{
val y = 2*i;
println( y );
}
"i to j"或者"i until j"均表示创建一个区间Range
区别:to表示=这个数字;until表示<这个数字
object test {
def main(args: Array[String]): Unit = {
val num:Int = 10;
for ( i: Int <- 1 to num )
{
println( i * 100 );
}
}
}
结果展示:
object test {
def main(args: Array[String]): Unit = {
for { i: Int <- 1 until 100 }
{
val y = 2*i;
println( y );
}
}
}
结果展示:
object test {
def main(args: Array[String]): Unit = {
//打印直角在左下的直角三角形
for(i<-1 to 5) {
for(j<-1 to i) {
print("*")
}
println()
}
}
}
结果展示:
object test {
def main(args: Array[String]): Unit = {
//打印直角在左上的直角三角形
for(i<-5 to 1 by -1) {
for(j<-i to 1 by -1) {
print("*")
}
println()
}
}
}
结果展示:
object test {
def main(args: Array[String]): Unit = {
//打印直角在右下的直角三角形
for(i<-1 to 5 ) {
for(j<-1 to 5-i ) {
print(" ")
}
for(j<-1 to i){
print("*")
}
println()
}
}
}
结果展示:
object test {
def main(args: Array[String]): Unit = {
//打印直角在右下的直角三角形
for(i<-1 to 5 ) {
for(j<-1 to i-1 ) {
print(" ")
}
for(j<-1 to 6-i){
print("*")
}
println()
}
}
}
结果展示:
object test {
def main(args: Array[String]): Unit = {
//打印等腰三角形
for(i<-1 to 5){
for (j<-1 to 5-i) {
print(" ")
}
for(j<-1 to 2*i-1){
print("*")
}
println()
}
}
}
结果展示:
object test { def main(args: Array[String]): Unit = { //外循环决定行,内循环决定列 共5行 固 i为1-5 for(i<-1 to 5) { //空格数从 4-0 固 5-i for(j<-1 to 5-i) { print(" ") } //*的数量 为 1 3 5 7 固 2*i-1 for(j<-1 to 2*i-1) { //空心 顾名思义 只留最边的*号 if(j==1 || j==2*i-1 ||i==5){ print("*") }else{ print(" ") } } //后续空白 有无无所谓 同第一个内循环 for(1<-1 to 5-i){ print(" ") } println() } } }
结果展示:
object test {
def main(args: Array[String]): Unit = {
for(i<-1 until 10) {
for(j<-1 to i) {
print(i+"*"+j+"="+(i*j)+"\t")
}
println()
}
}
}
结果展示:
import.scala.util.control.Breaks._
val num:Int = 10;
for ( i: Int <- 1 to num by 2 ) {
if(i>=5) break;
println( i * 100 );
}
by表示步长
import scala.util.control.Breaks
var num=10
val loop=new Breaks
loop.breakable(
for(x<-num to 1 by -1) {
if(x<3)loop.break
println(x)
}
)
object test {
def main(args: Array[String]): Unit = {
import scala.util.control.Breaks._
var num=10
breakable{
for(x<-num to 1 by -1) {
if(x<3)break
println(x)
}
}
}
}
结果展示:
val num:Int = 10;
for ( i: Int <- 1 to num; if i%2==0;if i>5 ) //多个条件时使用分号(;)
{
println( i * 100 );
}
for循环中的yield会把元素记下来,保存在集合中,循环结束后将返回该集合。也称for推导式
val num:Int = 10;
var retVal=for ( i: Int <- 1 to num; if i%2==0;if i>5 ) yield i; //for循环使用yield将具有返回值
for(a<-retVal){
println(a);
}
//输出6 8 10
var i=100
val resValue = for (x <- 1 to i; if x % 2 == 0; if x % 5 == 0) yield x
println(resValue)
for(i<-resValue) {
println(i)
}
结果展示:
使用Scala编程输出如图所示加法表
object test {
def main(args: Array[String]): Unit = {
for(i<-0 to 6 by 1) {
println(s"$i+${6-i}=6")
}
}
}
结果展示:
存储固定大小的元素
数组索引从0开始
//数组创建方式一
var a1:Array[String] = new Array[String](3) //泛型使用方括号
a1(0)="Jason" //数组元素访问使用圆括号
a1(1)="Marie"
a1(2)="Jimmy"
//数组创建方式二
var a2=Array("Jason","Marie","Jimmy") //调用Array的伴生对象中的apple()返回Array实例
//数据创建方式三:区间数组
var a3=Array.range(1,10,2)
可以包含不同类型的元素
最多支持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 )} //元组声明方式二 var tp2 = new Tuple3("Mike", "123 ABC street", 58) //元组声明方式三 def mike = "Mike" -> 5 //输出scala.Tuple2 mike.getClass //将元组元素依次赋给三个变量 val(name, address, age) = tp1 println(name) println(address) println(age)
输出结果:
Seq
Set
Map
不可变集合
可变结合:可以修改、添加或移除一个集合的元素
var a=scala.collection.mutable.ListBuffer(1,2,3)
a(1)=1
a
var b=List(1,2,3)
b.getClass
b.drop(1)
a
b
Scala.collection.immutable
Set:ListSet、HashSet、TreeSet
Map:ListMap、HashMap、TreeMap
Seq:Vector、String、Range、List、Stack、Stream、Queue
scala.collection.mutable
常用集合
名称 | 可变/不可变 | 示例 |
---|---|---|
Buffer | mutable | val buffer=scala.collection.mutable.ArrayBuffer[Int](10,20,30); buffer+=(2,3) |
Array | mutable | val arr=Array(1,2,3) |
List | immutable | val lst=List(1,2,3) |
Map | mutable | val stu=Map(“name”->“Jason”,“age”->“18”) |
Set | mutable/immutable | val set=Set(1,2,3) |
Vector | immutable | val v=Vector(1,3,5,7,11,13) |
Stack | mutable/immutable | val st=scala.collection.mutable.Stack(1,2,3) //堆栈,先进后出 |
Queue | mutable/immutable | val q=scala.collection.mutable.Queue(1,2,3) //队列,先进先出 |
BitSet | mutable/immutable | val bit=scala.collection.mutable.BitSet(3,2,0) //位集合 |
ListMap | immutable | val map=scala.collection.mutable.ListMap(1->“one”,2->“two”) |
HashSet | mutable | val set=scala.collection.mutable.HashSet(1,2,3) |
HashMap | mutable | val stu=scala.collection.mutable.HashMap(“name”->“Jason”,“age”->“18”) |
var c = List[Char]('a', 'b', 'c')
var x = 'x' +: c // (x, a, b, c)
var y = c :+ 'x' // (a, b, c, x)
import scala.collection.mutable._
var lb = ListBuffer[Int](1, 2, 3, 4)
lb += 100 //1, 2, 3, 4, 100
lb += (21, 33)//
88 +=: lb //88, 1, 2, 3, 4, 100, 21, 33
List(77, 66) ++=: lb
var l = List[Int](2, 3, 4, 6, 8, 9, 11, 20)
var x = l grouped 3 //等价l.grouped(3)
x.next() //(2, 3, 4)
x.next() //(6, 8, 9)
var y = l sliding 2
y.next() // (2, 3)
y.next() // (3, 4)
var a1 = Array[Int](1, 2, 3, 4) var a2 = Array[Int](100, 200, 300, 400) var a = List.concat(a1, a2)//Array->List a3=a1++a2 //Arrays->Array a(3) = 333 //Error a3(3)=333 //OK var b = Array(333, "333", '3', false ) var c = List.concat(a, b) val x = a.filter( _ %2 != 0 ) val y = a.reverse var m = a.groupBy(t => t%2 == 0) var n = a.slice(2, 4) a.sorted //1, 2, 3, 4, 100, 200, 300, 400 a.sorted( Ordering.Int.reverse ) a.sortWith( _ > _ ) a.sortBy( x => x ) //升序 a.sortBy( x => x*(-1) ) //降序
var s = Set("ab", "yz")
s += "mn" //mn, ab, yz
s += "mn" //??
s -= "yz" //mn, ab
var t = Set("ab", "gh", "mn", "st", "yz" )
t -- s //gh, st, yz
t ++ s //ab, gh, mn, st, ya
var os = SortedSet(1, 99, 66, 54, 77 )
os //1, 54, 66, 77, 99
os += 33
os //1, 33, 54, 66, 7
var s = Set("ab", "yz")
var t = Set("ab", "gh", "mn", "st", "yz" )
//求交集
t & s
t intersect s
//求并集
t | s
t union s
//求差集
t &~ s
t diff s
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)
m += ("j"->0) //??
m += ("j"->11) //??
var n = m ++ Map[String, Int]("a"->3, "j"->99) //??
n -= ("g", "e")
Stream是List惰性版(需要的时候再去调用)
val stream = (1 to 1000).toStream
stream // Stream(1, ?)
stream.head // 1
stream.tail // Stream(2, ?)
stream(3)
stream.tail // Stream(2,3,4,?)
Vector拥有连续的内存空间,利于随机存取(直接访问)
val v = Vector.empty :+ 2 :+ 2
val v1 = v ++ Vector[Int](3)
v.length
v1.length
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。