Scala基础
Scala基础1、介绍Scala是spark和kafka采用的编程语言,本质上是对java语言进行脚本化处理,使得开发效率更高。Scala的代码编写起来非常简洁,但并不简单,主要是很多语法比较诡异,对于刚刚接触到scala的人员来讲,往往有些摸不到头脑。 2、scala使用打开scala的shell命令行窗口,输入1 + 1,可以直接进行求值运算。scala shell采用REPL方式进行交互,即read->evalute->print->loop。进入如下环境,运行效果如下图所示: cmd>scala.bat scala> 1 + 1 2.1 查看帮助$scala>:help 2.2 退出$scala>:quit 2.3 常量和变量scala的量分为常量和变量,var是变量,可以重新赋值,val是常量,不可以重新复制。 // 变量 val x =10 // 错误,不能重新赋值 x = 20 var x = 10 // 正确 x = 20 2.4 类型推断与自动补全val x = 100 val x:Int = 100 // tab键自动提示 x.<tab> 2.5 定义函数递归函数必须显式定义函数,因为无法进行类型推荐。 // 参数必须定义类型,返回值可以不写,自动推断出来 def add(a:Int,b:Int) = { a + b } // 显式定义返回值类型 def add(a:Int,b:Int):Int = { a + b } // 递归实现阶乘 def frac(n:Int):Int = { if(n == 1) 1 else n * frac(n - 1) } 2.6 to和untilto和until都可以定义Range集合,to是闭区间,until是半闭半开区间。 // 1 .. 10 1 to 10 1.to(10) // 1 .. 9 1 until 10 1.until(10) 2.7 字符串// 取交集,lo "hello".intersect("world") 2.8 BigIntvar b = BigInt(999999999) b * b * b * b 2.9 ++/--scala没有++或--操作,可以使用+=或-=,这些也都是方法。 var x = 1 // x ++ x += 1 x.+=(1) // x -- x -=1 x.-=(1) 2.10 sqrt与pow开方函数和幂函数都在math包下,因此需要导入才能使用: import scala.math._ // 4开方=2.0 sqrt(4) // 2的立方=8 pow(2,3) 2.11 表达式的值scala的每个表达式或者代码块都有值,最后一行语句的值就是表达式的值。 val x = 2 // y = 1 val y = if (x < 1) -1 else 1 2.12 apply方法scala为很多类提供了apply方法,可以方便进行各种对象的创建和元素的获取,apply方法名成通常可以省略,因此会让方法调用显得有些奇怪。 // 省略apply方法名 val arr = Array[Int](1,2,3) val arr = Array[Int].apply(1,3) ; // 省略了apply方法 "hello"(0) "hello".apply(0) 2.13 粘贴模式在scala shell可以使用粘贴模式来贴入大量代码: # 进入粘贴模式的命令 $scala>:paste # ctrl + d退出粘贴模式 2.14 读取控制台输入// 字符串为控制台提示符 val name = readLine("请输入用户名:") ; println(name) ; 运行结果如图: 2.15 循环2.15.1 whilewhile循环同java相似,都是用boolean类型表示进行控制。
2.15.2 for
2.16 breakscala没有break语句,需要导入特定的函数来执行: // 导入break函数 import scala.util.control.Breaks.break for(i <- 1 to 10){ if(i % 3 == 0){ break } } 2.17 yield产生新集合// 每个元素 * 2,组成新集合 for(i <- 1 to 5) yield i * 2 执行结果如下: 2.18 函数
2.19 lazylazy是延迟计算,即表达式不会立即求值,而是使用lazy字样作为占位符,等真正用到的时候再进行计算。spark的广播变量中使用该中方式进行的实现。 // lazy变量,不会出错 lazy var x = 1 / 0 // 出错 x 2.20 定义数组
2.21 ArrayBuffer数组缓冲区是可变数组,位于scala.collection.mutable包下,使用时需要进行导入。scala使用符号定义的方法有一定规律性:
2.22 java与scala集合互操作java集合可以和scala进行相互无缝调用,需要导入隐式转换包才可以。代码如下: /* 自动将scala buffer转换成java list */ val list:java.util.List[String] = new java.util.ArrayList[String]() list.add("hello") list.add("world") def mybuf(buf:scala.collection.mutable.Buffer[String]) = println(buf.size()) import scala.collection.JavaConversions.asScalaBuffer mybuf(list) /* 自动将scala buffer转换成java list */ val buf = ArrayBuffer[String]("how","are","you") def mylist(list:java.util.List[String]) = println(list.size()) import scala.collection.JavaConversions.bufferAsJavaList mylist(buf) 3、map操作val t = (1,"tomas",12) // 元组 val t = (1,"tomas") // 对偶,对偶是特殊的元组,只有两个元素。 val t = 1 -> "tomas" // 对偶 val map = Map(1->"tom",2->"tomas",3->"tomasLee") // 构造map val map = Map((1,"tom"),(2,"tomas"),(3,"tomasLee")) // 构造map map(1) // 指定key,访问value map(2) // // 迭代key-value for((k,v) <- map){ println(k + " : " + v) } // 迭代key for(k <- map.keys){ ... } // 迭代values for(v <- map.values){ ... } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |