scala基础(变量、条件判断、循环)
1 scala 介绍
类似于java,也是jvm的一门编程语言,集成面向对象和函数式编程的各种特性
2 scala特点
(1)面向对象: 一切皆对象, 和java一致。
(2)函数式编程: 方法可以作为参数进行传递
(3)编码效率高: Scala语言表达能力强, 一行代码抵得上Java多行, 开发速度快;
3 scala与java的关系
Scala与Java的关系是非常紧密的! ! 因为Scala是基于Java虚拟机, 也就是JVM的一门编程语言。 所有Scala的代码,都需要经过编译为字节码, 然后交由Java虚拟机来运行。 所以Scala和Java是可以无缝互操作的。Scala可以任意调用Java的代码。 所以Scala与Java的关系是非常非常紧密的。
4 scala变量
在scala中声明变量有两个关键字val和**var**
val: 声明的变量不可以改变其引用, 相当于java中的final常量
var: 声明的变量可以改变其引用
但是在scala程序中, 通常建议使用val, 也就是常量, 因此比如类似于spark的大型复杂系统中, 需要大量的网络传输数据, 如果使用var, 可能会担心值被错误的更改 。
末尾可不用“;”,自带分号推断机制,如果多行代码写在了同一行,需要“;”分隔。
声明变量的通用格式:
关键字 变量名:变量类型 = 变量类型
//val: 修饰的变量不可更改,类似于java中的final
val name: String = "张三"
val age: Int = 20
//var: 修饰的变量可以更改
var name2: String = "王五"
指定类型: 无论使用var或val关键字声明的变量, 都可以手动指定其类型, 如果不指定的话, scala会自动根据值, 进行类型的推断。
声明多个变量: 可以一次声明多个变量。
//变量类型省略,scala会自动判断变量类型
val name3 = "赵六"
//Any类似于java中的Object,所有类型的父类型
val color :Any = "red" //30 //true //"red"
//一次给多个变量赋值
val n1,n2,n3 :String = "scala"
数据类型
在scala中, 有数据类型Byte、 Char、 Short、 Int、 Long、 Float、 Double、 Boolean。貌似与Java的基本数据类型的包装类型相同, 但是scala没有基本数据类型与包装类型的概念, 统一都是类! scala自己会负责基本数据类型和引用类型的转换操作
类型的加强版类型: scala使用很多加强类给数据类型增加了上百种增强的功能或方法。
·例如, Scala还提供了RichInt、 RichDouble、 RichChar等类型, RichInt就提供了to方法, 1.to(10), 此处Int先隐式转换为RichInt, 然后再调用其to方法 。基本操作符
•scala的算术操作符与java的算术操作符也没有什么区别, 比如+、 -、 *、 /、 %等,以及&、 |、 ^、 >>、 <<等。
但是, 在scala中, 这些操作符其实是数据类型的方法, 比如1 + 1, 可以写做1.+(1)
•例如, 1.to(10), 又可以写做1 to 10
• scala中没有提供++、 —操作符, 我们只能使用+和-, 比如num = 1, num ++是错误的, 必须写做num += 1.
Any的父类是Object
容易混淆的几个类型:
/**
* scala中没有基本数据类型和引用类型,统一都是类!Int、Double...
*/
//操作符统一都是方法
//to 左闭右闭
println(1.to(10))
println(1 to 10)
//until 左闭右开
println(1 until(10))
//scala中没有++操作,可以使用+=
var i = 0
i+=1
5 scala条件判断
if**条件判断
if表达式的定义: 在Scala中, if表达式是有值的, 就是if或者else中最后一行语句返回的值。
·例如, val num= 30; if (num> 18) 20 else 18
·可以将if表达式赋予一个变量, 例如, val num= if (age > 18) 1 else 0
·if表达式的类型推断: 由于if表达式是有值的, 而if和else子句的值类型可能不同, Scala会自动进行推断, 取两个类型的公共父类型。
·例如, if(age > 18) 1 else 0, 表达式的类型是Int, 因为1和0都是Int
·例如, if(age > 18) “adult” else 0, 此时if和else的值分别是String和Int, 则表达式的值是Any, Any是String和Int的公共父类型
·如果if后面没有跟else, 则默认else的值是Unit, 也用()**表示, 类似于java中的void或者null。 例如, val
age = 12; if(age > 18) “李四”。 此时就相当于if(age > 18) “李四” else ()
val num = 20
//if else 都是有返回值的,返回值就是最后一条语句的返回值;因为有返回值,所以if else可以赋值给一个变量
if (num < 20) "zhangsan" else "lisi"
val name = if (num < 20) "zhangsan" else "lisi"
println(name)
//在Scala中,无论是方法或函数以及条件判断,只要有返回值的,都可以不需加return
//if else中,如果返回值类型不一样,scala会自动推断出两者的公共父类型
val name2 = if (num < 20) "zhangsan" else 12
println(name2)
//如果缺省了else,默认返回值为Unit,用()表示,相当于java中的void
val name3 = if (num < 20) "lisi"
println(name3)在Scala中,无论是方法或函数以及条件判断,只要有返回值的,都可以不需加return
//if else中,如果返回值类型不一样,scala会自动推断出两者的公共父类型
val name2 = if (num < 20) "zhangsan" else 12
println(name2)
//如果缺省了else,默认返回值为Unit,用()表示,相当于java中的void
val name3 = if (num < 20) "lisi"
println(name3)
6 scala循环
while 循环: Scala有while循环, 基本语义与Java相同。
var n = 10
while(n > 0) { println(n); n -= 1}
跳出循环语句
scala没有提供类似于java的break语句, 但是可以使用boolean类型变量、return或者Breaks的break函数来替代使用 。
import scala.util.control.Breaks._
var num = 10
/* breakable({
do {
num -= 1
println(num)
if (num < 0) break()
} while (num < 10)
})*/
//使用标记为跳出while循环
var flag = true
while(flag){
num +=1
println(num)
if(num >20) flag=false
}
遍历(range范围, 字符串, 数组)
//to,左闭右闭
for (i <- 0 to 10) {
// println(i)
}
//until, 左闭右开
for (a <- 0 until 10) {
// println(a)
}
//遍历字符串
for (c <- "abcdef") {
// println(c)
}
//遍历数组
val arr2 = Array(1, true, "string")
// for (i <- arr2) println(i)
多重for循环
//多重for
// for (m <- 1 to 9; n <- 1 to 9) println(m +"*" +n+"="+m*n)
- if守卫: 取偶数 for(i <- 1 to 100 if i % 2 == 0) println(i)
//if 守卫
// for(b <- 1 to 10 if (b %2 == 0)) println(b)
- for推导式: 构造集合 for(i <- 1 to 10) yield i
//for推导式
val arr = for (c <- 1 to 5) yield c * 2
// for(i <- arr) println(i)
//中断for循环
breakable({
for (i <- 1 to 10) {
println(i)
if (i > 5) {
break()
}
}
})
还没有评论,来说两句吧...