Scala初步(基础篇)
Posted 麦田里的守望者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala初步(基础篇)相关的知识,希望对你有一定的参考价值。
简介
Scala是一门多范式的编程语言,同时支持面向对象和面向函数编程风格。它以一种优雅的方式解决现实问题。虽然它是强静态类型的编程语言,但是它强大的类型推断能力,使其看起来就像是一个动态编程语言一样。
就像Groovy,Clojure、JRuby等基于JVM虚拟机的编程语言一样,Scala的源码最终是被编译程Java字节,所以由Scala编译好的程序可以无缝的运行在JVM虚拟机之上。甚至你可以使用Scala开发android程序,这也意味着Scala和Java的类库可以相互调用。但是与其他基于JVM的编程语言相比较,Scala优秀的地方在于Scala除了具备面向对象编程的风格之外,Scala还拥有类似Scheme、Standard ML和Haskell一样的函数式编程风格,比如柯里化(Currying)、类型推断、不可变类型、延迟求值、模式匹配等,它还提供了其他的高级特性例如特质、协变和逆变、高阶函数和类型(Higher-order)、lambda等,其他特性如操作符重载、默认参数、命名参数、原始字符串、字符串插值等。 总之,Scala编程语言的好处如下:
面向对象 在Scala编程语言中,一切值都是对象,每一个操作都是方法调用,不像Java中还有int、boolean等基本类型。传动的编程模式也适用于Scala,比如简单的可以通过Object实现,模式匹配可以实现visitor模式。通过隐式类,Scala可以为其他已用的类型增加新方法,即使这些类来自Java(C#很早也添加了这个功能)。隐式方法在Scala库和其他项目(如Kafka)都得到了广泛的应用,极大地扩展了既有类的功能,同时还精简了代码。
函数式编程 Scala还是一种函数式编程语言,而且语法相当方便。这种将面向对象和面向函数编程混合的方式真是一种天才的设计。它还包括了很多你想要的函数编程的功能。面对于熟悉面向对象的开发者而言,同样没有违和感。与其他的函数式语言不同,Scala允许你渐进地使用函数式风格。在你不熟悉函数式编程的情况下,你可以把它看成一门没有分号分割的Java语言。随着对Scala语言的熟悉,你会渐渐喜欢上其简介的函数式风格。
无缝的Java互操作 Scala代码编译成Java的字节码,所有理论上来说,你可以随意地在项目中混用这两种语言,比如在Maven或者SBT管理项目中,他们的代码结构都是类似的。而且代码之间可以相互引用。当然,Java使用Scala生成的类型并不总是非常方便,比如Scala中包含实现方法的特质(Trait),并不能直接编译成Java的接口,所以,有时候Scala项目也会专门提供Java使用的API,如Apache Spark项目。
函数也是对象 在Scala中,函数有类型的,一个函数也是一个对象,有确定的类型。函数拥有一下特性:
1.可以被放在变量和数据结构中。
2.可以当作函数参数。
3.可以当做函数的返回值。
4.可以在运行期间被创建。
趣味性 使用Scala编程是一件享受的事情,Scala语言提供了如此丰富的特性,而且的它的迭代快速不古板迂腐。Scala还在大数据领域得到广泛的应用,如Spark、Kafka等都是使用Scala开发。一些著名的公司如Twitter、Foursquare、Coursera、LinkedIn、Verizon等也在广泛的使用Scala。Scala之父Martin OrderSky瑞士洛桑联邦理工学院的教授,德国人编程语言和代码分析专家。他另外两个知名工作Generic Java和Javac.Martin OrderSky于2001年设计Scala语言,java平台的Scala于2003年底至2004年初推出,该语言的第二个版本v2.0发布于2006年3月,2011年底Martin OrderSky和Akka的作者Jonas Boner一起成立了TypeSafe公司致力于推广Scala.
Scala安装(Windows版本)
Scala 语言可以运行在Window、Linux、Unix、 Mac OS X等系统上。Scala是基于java之上,大量使用java的类库和变量,必须使用Scala之前必须先安装 Java(>1.5版本)。 1)检查JDK版本(JDK安装略)
C:\Users\Administrator>java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
2)下载并安装配置Scala基本环境
访问http://www.scala-lang.org/download/2.13.0-M3.html
下载后双击msi文件,指定安装目录后其他选项一律使用默认配置,安装完毕后需要在windows上配置SCALA_HOME环境变量。
打开CMD命令窗口测试
Scala类型&变量
类型层次结构
正在Scala中所有的value都有一个类型包括值和函数,下图说明了类型层次结构的子集。
Any
是所有类型的超类型,也称为顶级类型。它定义了某些通用方法,如equals, hashCode和toString.Any 有两个直接子类 AnyVal 和 AnyRef.
AnyVal
表示所有的值类型,有九种预定义的值类型,它们是不可为空的。Double, Float, Long, Int, Short, Byte, Char, Unit, 和 Boolean。Unit是一种不带有意义信息的价值类型。一个Unit实例的字面值可以是().所有函数必须返回一些东西,所以有时候Unit是一个有用的返回类.
AnyRef
表示引用类型,所有非值类型都定义为引用类型。Scala中的每个用户定义类型都是AnyRef的子类型,如果在Java运行时环境的上下文中使用Scala,则AnyRef对应于java.lang.Object。
Nothing
是所有类型的子类型,也称为底部类型。该类型没有值。
Null
该类型是所有引用类型的子类型,该类型有一个关键的字面值null。 下面是一个示例,它演示了字符串,整数,字符,布尔值和函数就像所有其他对象一样都是对象:
val list: List[Any] = List(
"a string",
732, // an integer
'c', // a character
true, // a boolean value
() => "an anonymous function returning a string"
)
list.foreach(element => println(element))
上面定义了List [Any]类型的变量列表。该列表使用各种类型的元素进行初始化,但它们都是scala.Any的实例,因此您可以将它们添加到列表中。这是程序的输出:
a string
732
c
true
$line3.$read$$iw$$iw$$$Lambda$1028/1270823096@36551e97
类型映射
值类型可以通过以下方式转换:
例如:
val x: Long = 987654321
val y: Float = x // 9.8765434E8 (note that some precision is lost in this case)
val face: Char = '☺'
val number: Int = face // 9786
类型映射是单向的,一下编译器编译出错
val x: Long = 987654321
val y: Float = x // 9.8765434E8
val z: Long = y // Does not conform
你还可以将引用类型转换为子类型。这将在的后期介绍到。
变量定义
var a:Int = 1
var str:String = "hello world"
var pair:(Int,String) = (1,"测试") //元组
var b=1
var i:Int=1
var j=1:Byte
var tuple=(1,2)//元组
注意:上图中列出的数据类型都是对象,也就是说scala没有java中的原生类型。在scala是可以对数字等基础类型调用方法的。
算术运算符
算术运算符:+、-、*、/、%、 关系运算符:==、!=、>、<、>=、<= 逻辑运算符:&&、||、! 位运算符:&(按位与)、|(按位或)、^(异或)、~(取反)、<<、>>、>>>(无符号) 赋值运算符:= 、组合赋值:(算术|位运算=)
条件分支&循环控制
if条件分支
if(布尔表达式 1){
// 如果布尔表达式 1 为 true 则执行该语句块
}else if(布尔表达式 2){
// 如果布尔表达式 2 为 true 则执行该语句块
}else if(布尔表达式 3){
// 如果布尔表达式 3 为 true 则执行该语句块
}else {
// 如果以上条件都为 false 执行该语句块
}
while循环控制
// 局部变量
var a = 10;
// while 循环执行
while( a < 20 ){
println( "Value of a: " + a );
a = a + 1;
}
do-while循环
var a:Int = 0
do{
println( "Value of a: " + a );
a = a + 1;
}while( a < 20 )
for循环
var a = 0;
// for 循环
for( a <- 1 to 10){
println( "Value of a: " + a );//打印1-10
}
for( a <- 1 until 10){
println( "Value of a: " + a );//打印1-9
}
for 循环 中你可以使用分号 (;) 来设置多个区间,它将迭代给定区间所有的可能值(实现嵌套)
var a = 0;
var b = 0;
for( a <- 1 to 3; b <- 1 to 3){
println( "Value of a: " + a );
println( "Value of b: " + b );
}
for循环集合
val numList = List(1,2,3,4,5,6);
// for 循环
for( a <- numList ){
println( "Value of a: " + a );
}
for循环过滤
var a = 0;
val numList = List(1,2,3,4,5,6,7,8,9,10);
// for 循环
for( a <- numList
if a != 3; if a < 8 ){
println( "Value of a: " + a );
}
}
for使用yield
var a = 0;
val numList = List(1,2,3,4,5,6,7,8,9,10);
// for 循环
var retVal = for{ a <- numList
if a != 3; if a < 8
}yield a
// 输出返回值
for( a <- retVal){
println( "Value of a: " + a );
}
match-case
Scala中取消了switch-case语法,取而代之的是使用match-case语法,也称为模式匹配。
var sex="..."
var alias =sex match {
case "boy" => "男孩"
case "girl" => "女孩"
case default => "怪物"
}
println(alias)
default关键字可以省略使用
-
替换.
Break语法 Scala 语言中默认是没有 break 语句,但是你在 Scala 2.8 版本后可以使用另外一种方式来实现 break 语句。当在循环中使用 break 语句,在执行到该语句时,就会中断循环并执行循环体之后的代码块。Scala 中 break 的语法有点不大一样,格式如下:
var a = 0;
val numList = List(1,2,3,4,5,6,7,8,9,10);
val loop = new Breaks;
loop.breakable {
for( a <- numList){
println( "Value of a: " + a );
if( a == 4 ){
loop.break;
}
}
}
println( "After the loop" );
微信ID:jiangzz_wy
扫描关注一下,拜托拜托啦~
温馨提示
以上是关于Scala初步(基础篇)的主要内容,如果未能解决你的问题,请参考以下文章
Spark MLlib速成宝典基础篇01Windows下spark开发环境搭建(Scala版)