scala入门基础知识-语法及控制结构

被刻印的时光 ゝ 提交于 2019-12-23 01:03:50

1 Scala基础知识和语法

1.1 语法特点
(1)可拓展:面向对象、函数式编程
(2)兼容JAVA:类库调用、互操作
(3)语法简洁:代码行短、类型推断、抽象控制
(4)静态类型化:可检验、安全重构
(5)支持并发控制:强计算能力、自定义其他控制结构
1.2 Scala和Java的关系
(1)都是基于JVM虚拟机运行的
Scala编译之后的文件也是.class,都要转换为字节码,然后运行在JVM虚拟机之上。
(2)Scala和Java相互调用
在Scala中可以直接调用Java的代码,同时在Java中也可以直接调用Scala的代码
(3)Java 8 vs Scala

  • Java 8(lambda)没有出来之前,Java只是面向对象的一门语言,但是Java 8出来以后,Java就是一个面向对象和面向函数的混合语言了。
  • 首先我们要对Scala进行精确定位,从某种程度上讲,Scala并不是一个纯粹的面向函数的编程语言,有人认为 Scala是一个带有闭包的静态面向对象语言),更准确地说,Scala是面向函数与面向对象的混合。
  • Scala设计的初衷是面向函数FP(function progaming),而Java起家是面向对象OO(objected oriented),现在两者都是OO和FP的混合语言,是否可以这么认为:Scala = FP + OO,而Java = OO+ FP?moving…
  • 由于面向对象OO和面向函数FP两种范式是类似横坐标和纵坐标的两者不同坐标方向的思考方式,类似数据库和对象之间的不匹配阻抗关系,两者如果结合得不好恐怕就不会产生1+1>2的效果。
  • 面向对象是最接近人类思维的方式,而面向函数是最接近计算机的思维方式。如果你想让计算机为人的业务建模服务,那么以OO为主;如果你希望让计算机能自己通过算法从大数据中自动建模,那么以FP为主。所以,Java可能还会在企业工程类软件中占主要市场,而Scala则会在科学计算大数据分析等领域抢占Java市场,比如Scala的Spark大有替代Java的Hadoop之趋势。
    1.3 Scala解释器
    (1)Scala解释器读到一个表达式,对它进行求值,将它打印出来,接着再继续读下一个表达式。这个过程被称做读取–求值–打印–循环,即:REPL。
    (2从技术上讲,scala程序并不是一个解释器。实际发生的是,你输入的内容被快速地编译成字节码,然后这段字节码交由Java虚拟机执行。正因为如此,大多数scala程序员更倾向于将它称做“REPL”。
    1.4 var和val定义变量
    ​ scala中定义变量,通过var或者val来进行,如果要定义一个函数,就是def。
  • var:定义的是(可变的量)变量
  • val:定义的是不可变的量,类似java中被final关键字修饰的变量,只能进行输出。
    在开发过程中,建议搭建使用后者val,而不是var,除非我们操作的一个变量需要进行修改,除此以外使用val进行修饰。
    变量的定义方式:val/var aaa:Int = 3,但是scala觉得这种写法太过啰嗦,可以做自动类型的推断,所以上述的写法就可以转化为:var/val aaa = 3
    1.5 Scala数据类型
数据类型 描述
Byte 8bit的有符号数字,范围-128-127
Short 16bit的有符号数字,范围-32768-32767
Int 32bit的有符号数字,范围-2147483648-2147483647
Long 64bit的有符号数字
Float 32bit,单精度浮点数
Double 64bit,双精度浮点数
Char 16bit Unicode字符,范围U+0000到U+FFFF
String 字符串
Boolean 布尔类型
Unit 表示无值,和其他语言中的void等同
Null 空值或空引用
Nothing 所有其他类型的子类型,表示没有值
Any 所有类型的超类,任何实例都属于any类型
AnyRef 所有引用类型的超类(数组、集合)

数据类型关系

  • 要点
    1.Any 是所有类的父类,包括值类型 AnyVal ,和引用类型 AnyRef。
    2.AnyVal 是 所有值类型的父类,包括 Int ,Double ,Boolean ,Unit 等等。
    3.AnyRef 是所有引用类型的父类,包括 Null。
    4.Null 是所有引用类型的子类。
    5.Nothing 是所有类的子类。
    6.Unit 类型只有一个实例,是() ,相当于 java中的 void ,没有任何的实质意义。
    7.Null 也只有一个实例,是 null , 相当于 java中的 null ,能赋值 给任何引用 类型。

2 Scala控制结构

2.1 if 表达式
​(1)与java中的if或者if-else或者if-else if-else相比,有一点不同,scala的if-else有返回值。scala中的任何表达式都有返回值!scala中返回值,不需要使用return语句,最后一句,自动作为返回值。
(2)scala中语句的终止不需要使用";",当然如果一行上面有多条语句,无法进行区分,就只能使用";"来进行分割;

object IfDemo {
	def main(args:Array[String]):Unit = {	
		val age = 18
		/*
		if(age >= 18) {
			println("adult~")
		} else {
			println("kid")
		}*/
		val ret = if(age >= 18) {
			"adult~"
		} else {
			"kid"
		}
		println("ret : " + ret)
	}
}

知识点补充
java中代码执行顺序:静态代码块-父类构造代码块和构造方法-子类构造代码块和构造方法。
scala中的代码块可没有静态代码块或者构造代码块,就是普通的代码,就是在{}之间有多条语句在执行,不同之处和java中的,scala中的代码块有返回值!scala中的代码块通常用来做一些变量的初始化:
2.2 循环
scala中的循环和java中的循环一样,不同之处在于,for写法不大一样,同时,循环表达式也有返回值。
(1)while

    object WhileDemo {
    	def main(args:Array[String]):Unit = {	
    	//计算1+。。。+10的和
    	var sum = 0
    	var n = 1
    	while(n <= 10) {
    	sum += n
    	//n++ //++在scala中是集合中的方法,不能当做java中的自增操作
    	n += 1
    	}
    	println("sum: " + sum)
    	}
    }

(2)do…while

    object DoWhileDemo {
    	def main(args:Array[String]):Unit = {	
    	//计算1+。。。+10的和
    	var sum = 0
    	var n = 1
    	do {
    	sum += n
    	n += 1
    	}while(n <= 10)		
    	println("sum = " + sum)
    	}
    }

(3)for
scala中的for循环,并没有像java中的基本循环
for(初始化;条件表达式;自增) {
​ 循环体
}
scala中的for循环,更像java中的高级for循环(foreach):
java中的foreach操作:for(Person p : persons) {…}
scala中的for循环操作:for(p <- persons) {....}

   scala> val str = "hello"
    str: String = hello
    scala> for(ch <- str) {
         | print( "\t")
         | }
 =========结  果============
     h    e    l    l    o  

(4)for循环的嵌套

object ForDemo {
    	def main(args:Array[String]):Unit = {	
    	//乘法口诀
    	/*for(int j = 0; j <= 5; j++) {
    	for(int i = 0; i <= 4; i++) {
    	System.out.print("*
    	}
    	System.out.println();
    	}*/
    	for(j <- 1 to 9) {
    	for(i <- 1 to 9) {
    	if(i <= j) {
    	print(i + "*" + j + "=" + (i * j) + "\t")
    		}
    		}
    		println()
    		}
    	}
    }

不过scala提供了另外更加强大的简写方式:

for(j <- 1 to 9; i <- 1 to 9 if i <= j ) {
    	print(i + "*" + j + "=" + (i * j) + "\t")
    	if(i == j)
    		println
    }

2.3 循环的终止
java中的循环终止主要有:break、continue和return。
在scala中没有break,没有continue,一般也不用return。
scala中终止循环有3种方式:

  1. 使用boolean变量来控制循环
  2. 使用return表达式跳出循环
  3. 使用scala提供的工具——breakable来控制循环
    小知识点补充:有一个带有C风格格式化字符串的printf函数–system.in
   printf("Hello, %s! You are %d yearsold.\n", "Fred", 42)
  //输出结果为:Hello, Fred! You are 42 yearsold.

示例:循环的终止:登录账号的案例,验证用户名和密码,如果超过3次,提示输入有误,锁定账号10分钟。
举例一:使用boolean变量来控制循环

object LoopTerminateDemo {
	def main(args:Array[String]):Unit = {	
	val dbName = "xxy"
	val dbPwd = 123456
	var count = 3
	while(count > 0) {
		count -= 1
		val name = readLine("请输入您的姓名:")
		print("请输入您的密码:")
		val pwd = readInt()
		var msg:String = null
		if(name == null || pwd == null) {
		msg = "error:用户名或密码不能为空!"
		}
		if(name == dbName && pwd == dbPwd) {
		println(s"welcome ${name}~~~~")
		//循环得需要终止
		count = 0
		} else {
		msg = "用户名或密码有误,请重试!"
		}
		if(msg != null) {
		println(s"$msg\t您还有${count}次重试机会")
			}
		}
	}
}

举例二:使用breakable结束循环的操作
使用breakable来结束循环,得需要导入breakable的包。

import scala.util.control.Breaks._
object LoopTerminateDemo {
	def main(args:Array[String]):Unit = {	
	val dbName = "xxy"
	val dbPwd = 123456
	var count = 3
	breakable {
	while(count > 0) {
	count -= 1
	val name = readLine("请输入您的姓名:")
	print("请输入您的密码:")
	val pwd = readInt()
	var msg:String = null
	if(name == null || pwd == null) {
    	msg = "error:用户名或密码不能为空!"
		}
	if(name == dbName && pwd == dbPwd) {
    	println(s"welcome ${name}~~~~")
		//循环得需要终止
		//count = 0
		break
		} else {
	msg = "用户名或密码有误,请重试!"
		}
	if(msg != null) {
    	println(s"$msg\t您还有${count}次重试机会")
				}
			}
		}
	}
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!