scala中没有三元运算符,因为根本不需要。scala中if else表达式是有返回值的,默认返回类型是Any类型,在根据实际返回的数值进行推断,如果if或者else返回的类型不一样,就返回Any类型(所有类型的公共超类型)。
Java 中 的三元运算符是为了弥补缺陷 Java 中 if else 的缺陷
java中 if else 是没有返回值的, Scala if else 有返回值
public String getName(Person person){
if(person.id == 1){
return “Nick”
}else if(person.id == 2){
return “Bob”
}
}
String Name = person.id == 1 ? “Nick”:”Bob”
1、if else 案例一
返回类型一样
val a1 = 10
//val a1 = 30
val a2 =
if(a1 > 20){
"a1大于20"
}else{
"a1小于20"
}
println(a2)
println(a2.getClass().getName())
尖叫提示:if else 是有返回值,返回类型是可以混杂在一起的,可以不是统一的
2、if else 案例二
缺少判断,返回类型不一样
val a3 =
if(a1 > 20){
"a3 大于 20"
}
println(a3)
println(a3.getClass().getName())
尖叫提示:如果缺少一个判断,什么都没有返回,但是Scala认为任何表达式都会有值,对于空值,使用Unit类,写做(),叫做无用占位符,相当于java中的void。行尾的位置不需要分号,只要能够从上下文判断出语句的终止即可。但是如果在单行中写多个语句,则需要分号分割。在Scala中,{}包含一系列表达式,其结果也是一个表达式。块中最后一个表达式的值就是块的值。
3、if else 案例三 if else是有返回值的
返回类型不一样
var flag = false
//返回unit ()
val result3 = if (a1 >= 20){
flag = true
}
//返回false
val result4 = if (a1 >= 20){
true
}
4、if else 案例四 变型
//大括号是可以省略的
val a5 = if(a1 > 20) "a1大于20" else 10
//点 和 括号 都可以省略
//()是unit的唯一实现
println(a5.getClass().getTypeName())
//括号是可以省略的
println(a5.getClass.getTypeName)
//点是可以省略的
println(a5.getClass getTypeName)
println((a5 getClass) getTypeName)
尖叫提示:使用REPL(dos 终端)比编译器来讲,有一个近视眼问题,它在同一个时间只能看到一行代码。
举例来说当你键入如下代码时
if (x > 0) 1
else if (x == 0) 0 else -1
REPL会执行if ( x > 0 ) 1,然后显示结果,之后它看到接下来的else关键字,就会不知所措了
如果你想在else前换行的话,用花括号
if ( x > 0 ) { 1
} else if ( x == 0 ) 0 else -1
只有在REPL中才会有这个顾虑,在被编译的程序中,解析器会找到下一行的else
但是如果你想在REPL中粘贴成块的代码,而有不想担心REPL的近视眼问题,可以使用REPL的粘贴模式,键入
:paste
把代码块粘贴进去,然后按下Ctrl + D
组合键,这样REPL就会把代码块当做一个整体来分析了