1 IF...ELSE语句
1.1 if...else 语句
def main(args: Array[String]): Unit = {
val x = 1
//判断x的值,将结果赋给y
val y = if (x > 0) 1 else -1
//打印y的值
println("y=" + y)
//支持混合类型表达式
val z = if (x > 1) 1 else "error"
//打印z的值
println("z=" + z)
//如果缺失else,相当于if (x > 2) 1 else ()
val m = if (x > 2) 1
println("m=" + m)
//在scala中每个表达式都有值,scala中有个Unit类,写做(),相当于Java中的void
val n = if (x > 2) 1 else ()
println("n=" + n)
//if和else if
val k = if (x < 0) 0
else if (x >= 1) 1 else -1
println("k=" + k)
}
1.2 if...else 嵌套语句
if(布尔表达式 1){
// 如果布尔表达式 1 为 true 则执行该语句块
if(布尔表达式 2){
// 如果布尔表达式 2 为 true 则执行该语句块
}}
def main(args: Array[String]) {
var x = 30;
var y = 10;
if( x == 30 ){
if( y == 10 ){
println("X = 30 , Y = 10");
}
}
}
总结:
1)if条件表达式它是有返回值的
2)返回值会根据条件表达式的情况会进行自动的数据类型的推断。
2 块表达式
块表达式的最后一行就是这个块表达式的返回值 , 如果最后一行是打印数据 返回值是()
val x = 0
val result = {
if(x < 0)
1
else if(x >= 1)
-1
else
"error"
}
println(result)
2.1 例子
object BlockDemo {
def main(args: Array[String]): Unit = {
/**
* 大括号的开始到大括号的结束就是一个代码块
* if() {代码块 }
* if(){码块} else {代码块}
* -------流程控制的if 只会执行一个代码块中的内容
* ------- 这个代码块的最后一行就是这个代码块的返回值
* -------- 代码块的返回值的数据类型是自动推导的
* 由此可以推导 if else 流程控制也是有返回值的 并且只有一个返回值
* 当代码块的最后一行的返回值类型不一致的时候 使用父类型来接收结果
* ----当代码块的最后一行是打印内容的代码 返回值是() 意思就是没有返回值
*/
val b = {
"hello"
1
}
// 使用b2来接收if else 的返回值
val b2:AnyVal = if(7 < 6){ // b2:Int 不对 b2:String 不对 两种类型的父类 欧了
"成立"
7
}else{
"恼子有病"
println("....")
}
println(b2)
}
}
3 for循环
java: for(int i=0;i< 10;i++){} 传统for 循环 增强for循环
语法格式: for (i <- 表达式/数组/集合)
to 到 包含后面的数据
until 到 不包含后面的数据
def main(args: Array[String]): Unit = {
//for(i <- 表达式),表达式1 to 10返回一个Range(区间)
//每次循环将区间中的一个值赋给i
for (i <- 1 to 10)
print(i+"\t")
//for(i <- 数组)
println()
val arr = Array("a", "b", "c")
for (i <- arr)
println(i)
//高级for循环
//每个生成器都可以带一个条件,注意:if前面没有分号
for(i <- 1 to 3; j <- 1 to 3 if i != j)
print((10 * i + j) + " ")
println()
//for推导式:如果for循环的循环体以yield开始,则该循环会构建出一个集合
//每次迭代生成集合中的一个值
val v = for (i <- 1 to 10) yield i * 10
println(v)
}
总结:
1)在scala里面没有运算符,都有的符号其实都是方法。
2)在scala里面没有++ -- 的用法
3)for( i <- 表达式/数组/集合)
4)在for循环里面我们是可以添加if表达式
5)有两个特殊表达式需要了解:
To 1 to 3 1 2 3
Until 1 until 3 12
6)如果在使用for循环的时候,for循环的时候我们需要获取,我们可以是使用yield关键字。
3.1例子
/**
* for循环入门语法
* for(e <- Range(1 to/until N) , Array , 集合) e就是元素
*
*
*/
object ForDemo1 {
def main(args: Array[String]): Unit = {
/**
* Range对象 一个范围数据
*/
val r1 = 1 to 10 // Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val r2 = 1 until 10 //Range(1, 2, 3, 4, 5, 6, 7, 8, 9)
// 遍历一个range
for (i <- 1 to 10) {
// println(i)
}
for (i <- 1 until 10) {
// println(i)
}
val arr = Array[String]("a", "f", "b", "s", "k")
// 遍历数组 取出数组中的每个元素 赋值给e
for (e <- arr) {
// println(e)
}
// 使用数组的角标的形式
for (index <- 0 until arr.length) {
println(arr(index))
}
}
}
/**
* 嵌套for循环
* 先执行外层循环一次 内层循环执行完
*/
object ForDemo2 {
def main(args: Array[String]): Unit = {
// 传统的嵌套循环
for(i<- 1 to 3){
for(j <- 1 to 3){
// println(i+"----"+j)
}
}
// 新形式的嵌套循环
for(i<-1 to 3 ;j <- 1 to 3){
if(j>=i){
print(i+"*"+j+"="+i*j +"\t")
if(j==3){println}
}
}
}
}
/**
* 守卫模式 : 对循环的数据进行筛选
* for(i <- 1 to 100 if i % 2 == 0) 单个条件
* for (i <- 1 to 100 if i % 2 == 0 && i > 80) 多个条件使用 && 连接
*/
object ForDemo3 {
def main(args: Array[String]): Unit = {
for (i <- 1 to 10) {
// 条件判断 符合条件的才答应
if (i % 2 == 0) {
print(i + " ")
}
}
println()
// 守卫模式 效率更高 简洁
for (i <- 1 to 10 if i % 2 == 1) { // 只循环5次
print(i + " ")
}
println()
val arr = Array("tom", "tim", "cat", "jerry")
//判断
for (e <- arr) {
if (e.startsWith("t")) println(e)
}
// 守卫模式
for (e <- arr if !e.startsWith("t")) {
println(e)
}
println()
for (i <- 1 to 100 if i % 2 == 0 && i > 80) {
println(i)
}
}
}
/**
* 推导式: 简化如下场景
* 过滤出一百以内的偶数 需要存储这些数据
* java怎么做 遍历出来 创建一个数组 集合 在for循环中添加进去
* for(int i = 0 ; i<=100 ; i++){
* if(i%2==0){
* list.add(i)
* }
* }
*
*/
object ForDemo4 {
def main(args: Array[String]): Unit = {
// 将100以内的偶数存起来 alt + enter Seq类似于数组的序列
var res: Seq[Int] = for(i <- 1 to 100 if i%2==0) yield i
var res2: Seq[Int] = for(i <- 1 to 100 if i%2==0) yield i*10 // 可以对遍历出来的元素进行操作 操作以后再存储起来
// 遍历res
for(e <- res){
println(e)
}
}
}
**
* 99乘法表
*/
object For99 {
def main(args: Array[String]): Unit = {
for(i <- 1 to 9 ; j <- 1 to i){
print(s"$j * $i = "+i*j +"\t")
if(i ==j) println()
}
}
}
/**
* 终止for循环
* java中有 break return continue
* return 跳出方法 后面的代码无法执行
*
*/
object BreakFor {
def main(args: Array[String]): Unit = {
for (i <- 1 to 10){
// println(i)
// if (i==5) return
}
var flag = true
/**
* 只有满足守卫模式中的条件的时候才会进入循环
*/
for (i <- 1 to 10 if flag){
println(i)
if(i == 5) flag = false
}
println("hhhh")
}
}
4 while和 do while
var n = 10
while(n<20){
println(n)
n+=1
}
var n = 10
do{
println("I first do")
n-=1
}while(n<10 && n>0)
总结:
1)while使用跟java一模一样
2)注意点:在scala里面不支持 i++ i-- 等操作
统一写成 i-=1
4.1 例子
/**
* for循环都有循环次数 ,
* 当不知道数据的循环次数的情况下可以使用while循环
* while循环容易产生死循环问题, 一定注意改变循环条件
*/
object WhileDemo1 {
def main(args: Array[String]): Unit = {
var i = 1
while(i < 10){
println(s"我喜欢学习 说 $i 次")
// 在scala没有++ 运算 -- +=
i +=1 // 修改终止的条件
}
}
}
object WhileDemo2 {
def main(args: Array[String]): Unit = {
// 定义一个数组对象
var arr = Array(2,4,6,8,10,11,12,13,14,15,16,17)
// 将数组转换成迭代器
val iterator = arr.toIterator
// 遍历迭代器中的数据
while(iterator.hasNext){
val e = iterator.next()
println(e)
}
}
}
**
* do {} while(条件表达式)
* 在while()语法中只要不满足条件 他可能一次也不执行
* do while 至少会执行一次
*/
object DowhileDemo {
def main(args: Array[String]): Unit = {
// 至少执行一次
do{
println("就是那么吊 , 至少会执行一次!!")
}while(false)
// 正常循环
var i = 1
do{
println("就是那么吊 , 至少会执行一次!!")
i+=1 // 修改条件
}while(i<10)
}
}