Scala入门详解(一)
简介
Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。
优点
- 优雅:这是框架设计师第一个要考虑的问题,框架的用户是应用开发程序员,API是否优雅直接影响用户体验。
- 速度快:Scala语言表达能力强,一行代码抵得上Java多行,开发速度快;Scala是静态编译的。
- 能融合到hadoop生态圈:Hadoop现在是大数据事实标准,Spark并不是要取代Hadoop,而是要完善Hadoop生态。JVM语言大部分可能会想到Java,但Java做出来的API太丑,或者想实现一个优雅的API太费劲。
Scala常识
-
约定
object:指scala中的特殊的单例对象,注意不要把object翻译成对象,以
免冲突
对象:指new关键字所创建的实例,和java中的对象指代同一事物
类 :和java语言指代一样
方法:和java语言指代一样,也可以叫操作
函数:指的是某种特殊的实例,与方法不能混为一谈
特质:类似java接口,但比接口强大
字段:也叫属性 -
编程规范
区分大小写:Scala是大小写敏感的,这意味着标识Hello和hello在Scala中会有不同的含义。标识符:Scala可以使用两种形式的标志符,字符数字和符号。字符数字使用字母或是下划线开头,后面可以接字母或是数字,符号"“开头的标识符为保留的 Scala 编译器产生的标志符使用,应用程序应该避免使用”$"开始的标识符,以免造成冲突。
类名:对于所有的类名的第一个字母要大写。如果需要使用几个单词来构成一个类的名称,每个单词的第一个字母要大写。
示例:class MyFirstScalaClass方法名称:所有的方法名称的第一个字母用小写。
如果若干单词被用于构成方法的名称,则每个单词的第一个字母应大写。
示例:def myMethodName()程序文件名:程序文件的名称应该与对象名称完全匹配。
保存文件时,应该保存它使用的对象名称(记住Scala是区分大小写),并追加".scala"为文件扩展名。(如果文件名和对象名称不匹配也可以)。代码语句分割:scala语句分割是英文分号(;)或换行,一条语句单独占一行时可省略分号,多条语句在一行时语句与语句之间的分号不可省略,
如: [1] val str = “scala 简学 ”; println(str)
[2] val hello = “Hello Scala”
[3] println(hello) -
程序入口
和其他语言一样,main方法都是操作系统调度执行时的执行入口,其为固定写
法:
object HelloScala {
def main(args: Array[String]): Unit = {
//edit your code
}
}
注:main方法必须在单例对象object中
- App特质
在 Scala中有一个特殊的特质,即App特质,一个预先定义好了main方法的特质,因此一个继承了App特质的object代码不需要主方法也可运行
Scala基础
数据类型
Scala 中的面向对象更彻底,在 scala 语言的世界中,万物皆对象。其中最显著的就
是摒弃了基本数据类型(语法上),即放弃加减乘除等这些操作,取而代之的是加减乘除
方法。Scala 中的类层次结构图如下:
包操作
- 定义包
- 第一种:和Java一样,在文件头定义包名,后续所有代码都放在
该包中。package com.runoob class HelloWorld
- 第二种:类似C#, 可以在一个文件中定义多个包。
package com.runoob { class HelloWorld }
- 第一种:和Java一样,在文件头定义包名,后续所有代码都放在
- 引用包
和Java一样使用import关键字导入包import java.awt.Color // 引入 Color import java.awt._ // 引入包内所有成员, import java.awt.{Color, Font} import java.util.{HashMap => JavaHashMap}// 重命名成员 // 引入了 util 包的所有成员,但是 HashMap 被隐藏了 import java.util.{HashMap => _, _}
声明变量
object VariableDemo {
def main(args: Array[String]) {
//使用val定义的变量值是不可变的,相当于java里用final修饰的变量
val i = 1
//使用var定义的变量是可变的,在Scala中鼓励使用val
var s = "hello"
//Scala编译器会自动推断变量的类型,必要的时候可以指定类型
//变量名在前,类型在后
val str: String = "world"
}
}
条件表达式
object ConditionDemo {
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)
}
}
循环表达式
在scala中有for循环和while循环,用for循环比较多,while循环和java的一样
object TestFor {
def main(args: Array[String]): Unit = {
// i to j 语法(包含j)[i,j]
// 可设置步长,默认为1
println("to语法:")
for (i <- 1 to (10,2)){
println(i)
}
// i until j 语法(不包含j)[i,j)
println("until语法:")
for (i <- 1 until 10){
println(i)
}
// 使用分号 (;) 来设置多个区间,它将迭代给定区间所有的可能值
println("多个区间:")
for( a <- 1 to 3; b <- 1 to 3){
println( "Value of a: " + a );
println( "Value of b: " + b );
}
// 遍历集合元素
println("遍历集合元素:")
var list = List(1,2,3,4,5)
for (i <- list){
println(i)
}
// 循环过滤,使用分号(;)来为表达式添加一个或多个的过滤条件
println("循环过滤:")
for (i <- list if i != 3; if i > 2){
println(i)
}
// 使用yield将for循环的返回值作为一个变量存储
println("yield:")
var tem = for { i <- list if i != 3 if i > 2 }yield -i*2
// 相当于
var tem2 = list.filter(_ != 3).filter(_ > 2).map(_ * -2)
for (i <- tem2){
println(i)
}
}
}