Scala(一)
来源:互联网 发布:java 图形验证码 开源 编辑:程序博客网 时间:2024/06/11 04:39
Scala魅力所在
1.优雅:这是框架设计师第一个要考虑的问题,框架的用户是应用开发程序员,API是否优雅直接影响用户体验。
2.速度快:Scala语言表达能力强,一行代码抵得上Java多行,开发速度快;Scala是静态编译的,所以和JRuby,Groovy比起来速度会快很多。
3. 能融合到Hadoop生态圈:Hadoop现在是大数据事实标准,Spark并不是要取代Hadoop,而是要完善Hadoop生态。JVM语言大部分可能会想到Java,但Java做出来的API太丑,或者想实现一个优雅的API太费劲。
4,Spark的开发语言,掌握好scala,就可以站在巨人的肩膀上学习spark。
两点,
1,scala是函数式编程语言,基于java开发的,和java一个级别
2,scala是spark的开发语言,可以融合到是大数据生态圈
下载Scala地址http://downloads.typesafe.com/scala/2.11.8/scala-2.11.8.tgz
1,解压Scala到指定目录
# tar -zxvf scala-2.11.8.tgz -C /usr/local/
2,创建一个软连接
# ln -s /usr/local/scala-2.11.8 /usr/local/scala
3,配置环境变量,将scala加入到PATH中
# vi /etc/profile
export SCALA_HOME=/usr/local/scala
export PATH=$PATH:$JAVA_HOME/bin:$SCALA_HOME/bin
编写第一个Scala程序
vim Scala
object ScalaTest {def main(args: Array[String]) :Unit={println("hello scala")}}
代码编译:
# scalac ScalaTest
代码运行:
# scala ScalaTest
IDEA插件的安装
Scala基础
编程式体验Spark-Shell
用Spark进行单词个数的统计
常用类型
Scala和Java一样,
有7种数值类型:Byte、Char、Short、Int、Long、Float和Double
2种非数值类型: Boolean和Unit 一个() 相当于java中的void 还有String类型
Scala的继承层级
声明变量
定义变量使用var或者 val关键字
语法:
var|val 变量名称 (: 数据类型) =变量值
bject VariableTest {
def main(args: Array[String]) {
// 使用val定义的变量值是不可变的,相当于java里用final修饰的变量
val i = 1
// 使用var定义的变量是可变的,在Scala中鼓励使用val
var s = "hello"
//Scala编译器会自动推断变量的类型,必要的时候可以指定类型 //变量名在前,类型在后
val str: String = "world"
}
}
object ConditionTest { def main(args: Array[String]) {
val x = 1
//判断x的值,将结果赋给y
val y = if (x > 0) 1 else -1
//打印y的值
println(y)
//支持混合类型表达式
val z = if (x > 1) 1 else "error"
//打印z的值
println(z)
//如果缺失else,相当于if (x > 2) 1 else ()
val m = if (x > 2) 1
println(m)
//在scala中每个表达式都有值,scala中有个Unit类,写做(),相当于Java中的void
val n = if (x > 2) 1 else ()
println(n)
//if和else if
val k = if (x < 0) 0
else if (x >= 1) 1 else -1
println(k)
}
}
每一个条件语句,都有返回值,默认返回值是最后一行的内容,如果没有内容或者内容为空,那么返回值就是Unit,或者说是()。
多条件分支中,缺少了某一个分支,默认会返回Unit。
我们的条件表达式,可以使用{},如果业务逻辑只有一行,可以省略{},完全放在一行。
if(x>2) 3 else 5
条件表达式里面,不能使用return这一关键字,默认返回最后一行的内容。
object BlockExpressionTest { def main(args: Array[String]): Unit = { val x=0// 在scala中,{}中最后一个表达式的值就是块的值,本例中result就是块的值,result后面就是一个块 val result={ if(x>0){ -1 }else if(x>=1){ 1 }else{ "error" } } println(result) }}
循环
在scala中有for和while循环,用for循环比较多
for循环语法结构:for(I <- 表达式/数组/集合)
两个生成器值得注意:to until
1 to 10 生成 Range(1,2,3,4,5,6,7,8,9,10)左右都是闭区间
1 until 10 生成 Range(1,2,3,4,5,6,7,8,9)左边是闭区间,右边是开区间
还有一个例子
val arr = Array(1, 2, 3, 4) for (i <- 0 to 3) println(i) for (i <- 0 to 3) println(arr(i))
输出的是 0 1 2 3 输出的是 1 2 3 4 根据角标输出对应位置的数还是输出本身的数,要分清楚
在for循环中,通过添加守卫来实现输出满足特定条件的数据
val arr=Array(1,2,3,4) for(i<- arr if i%2==0) print(i+" ")
def main(args: Array[String]): Unit = { val arr=Array(1,2,3,4) for(i<- 1 to 3;j<- 1 to 3 if i!=j) print((10*i+j)+" ") println() print("----------------")}
----------------
嵌套for只会把for下面一行放入“大括号”内,后面的都是按顺序执行
val arr2 = for (i <- 1 to 10) yield i * 10print(arr2)
输出结果Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)val arr2 = for (i <- 1 to 10) yield i%2==0print(arr2)
输出结果Vector(false, true, false, true, false, true, false, true, false, true)
yield的作用就是对元素进行操作,返回一个新的数组
函数式编程
后面经常对数组进行操作的方式:链式编程
map:对集合或者数组中的每一个元素进行操作,该方法接收一个函数,具体的业务逻辑是自己定义的
filter:过滤器,过滤出满足条件的元素
调用方法(运算符重载为方法)
a+b
本质就是 a.+(b) a调用了名字为+的方法
a 方法 b 可以写成a.方法(b)
e.g.:2+3 本质 2.+(3)
方法定义和调用
调用直接名称调用即可
正常情况下,可以不指定返回值的类型
def m1(x:Int,y:Int)=x*y
对于递归方法,必须指定返回类型
def rec(n:Int):Int= if (n==0) 0 else n*rec(n-1)
对于有return关键字的,必须指定返回类型
def meth1(x:Int,y:Double):Double = return x*y
如果方法没有显式指定返回值类型,那么返回值就是()
如果定义方法的时候没有参数,也没有使用(),那么调用的时候就不能有()
如果方法定义的时候没有参数,使用了(),那么调用的时候可以加()也可以不加()
函数的定义和调用
- scala学习(一)
- Scala 学习心得(一)
- scala初探(一)
- Scala练习(一)
- Scala基本概念(一)
- SCALA随笔(一)
- Scala(一)
- scala笔记(一)
- Scala总结(一)
- scala 初探(一)
- scala学习(一)
- scala(一)
- Scala学习(一)
- Scala(一)
- Scala Trait(一)
- scala(一)
- Scala教程(一)走进Scala世界
- Scala教程(一)走进Scala世界
- vim插件: nerdcommenter[快速注释]
- Hive实战:将xml文件处理为txt文件,并用Hive进行微博数据分析
- (C语言版)链表(二)——实现单向循环链表创建、插入、删除、释放内存等简单操作
- Volley源码解析(三)
- 触发器和存储过程
- Scala(一)
- 【C++程序设计】-从结构到类的演变
- 序列化和反序列化
- 转载整理-shell脚本的基本知识
- 经验总结-DDMS出现:远程主机强迫关闭了一个现有的连接的解决办法
- 消除pycharm中的波浪线的办法
- 进程,线程,递归调用找所有文件的案例,反射
- 【C++程序设计】-函数和函数模板
- 160