变量
声明变量 1.var&val
var:可以重新赋值
val:不可变变量/只读变量,相当于java中final修饰的变量
2.为减少可变性引起的bug,尽可能使用不可变变量
3.type关键字可以声明一个类型别名
String底层是 type String= java.lang.String 4.懒值lazy适合初始化开销大的场景,只有这个变量真正被使用,变量的赋值代码才会真正执行
package cn. hanjiaxiaozhi. basic
object _01_VariableDemo {
def main( args: Array[ String ] ) : Unit = {
val name: String = "jack"
var age: Int = 18
age = 20
println( name)
println( age)
type myS = String
val myname: myS = "tom"
lazy val msg = init( )
println( "init方法调用了,但是没有真正的执行" )
println( "直到真正使用到msg的时候init方法才执行" + msg)
}
def init( ) : Unit = {
println( "init方法真正执行了" )
"success"
}
}
}
数据类型
Scala中的数值类型和Java中的基本数据类型类似,但是都是对象类型,也就是说Scala才是真正的万物皆对象!
Any是根节点,包括:
Boolean true 或者 false Byte 8位, 有符号 Short 16位, 有符号 Int 32位, 有符号 Long 64位, 有符号 Char 16位, 无符号 Float 32位, 单精度浮点数 Double 64位, 双精度浮点数 String 其实就是由Char数组组成
引用类型
–AnyRef是所有引用类型的基类(除了值类型,所有其他类型都继承自AnyRef)比较特殊的几个类型
Null:只有一个实例对象,null(只能赋值给引用类型,而不能赋值给值类型)
Nothing:没有实例(可以作为没有正常返回值的方法的返回类型) Unit:类似java中的void,只有一个对象实例()
package cn. hanjiaxiaozhi. basic
object _02_TypeDemo {
def main( args: Array[ String ] ) : Unit = {
val a: Byte = 1
val b: Short = 2
val c: Int = 3
val d: Long = 4
val cc: Char = '1'
val s: String = "abc"
}
}
String类型
val / var 变量名 = "字符串"
val / var 变量名 = """字符串1字符串2"""
val / var 变量名 = s " ${ 变量/ 表达式 } 字符串"
package cn. hanjiaxiaozhi. basic
object _03_StringDemo {
def main( args: Array[ String ] ) : Unit = {
val s1: String = "str1"
val s2: String = """这里可以写很多字符串"""
val s3: String = """这里可以写很多字符串,
|还可以换行写""" . stripMargin
val name: String = "jack"
val s4 : String = "my name is " + name
val s5 : String = s "my name is ${ name } "
val tableName : String = "student"
val conditionValue: String = "tom"
val sql1: String = "select * from student where name = 'tom';"
val sql2: String =
s """
|select *
|from ${ tableName }
|where name = ${ conditionValue } ;
|""" . stripMargin
println( s1)
println( s2)
println( s3)
println( s4)
println( s5)
println( sql1)
println( sql2)
}
}
操作符
和Java类似, + - * / % … 其他的位运算 逻辑运算符和Java都是一样的规则, 位操作符有 $ | ^ >> << 注意:
1.scala中的操作符实际上是方法
2.scala中没有++ -- 操作符,需要通过+= -=来实现
package cn. hanjiaxiaozhi. basic
object _04_OperatorDemo {
def main( args: Array[ String ] ) : Unit = {
var a: Int = 1 + 2
var b = 1. + ( 2 )
a += 1
b. += ( 1 )
println( a)
println( b)
}
}
Java和Scala混编
package cn. hanjiaxiaozhi. basic
object TestComplex {
def main( args: Array[ String ] ) : Unit = {
println( "Scala代码" )
System. out. println( "Java代码" )
}
}
package cn. hanjiaxiaozhi. basic ;
import scala. Console ;
public class TestComplex2 {
public static void main( String [ ] args) {
System. out. println( "java" ) ;
Console. println( "scala" ) ;
}
}
表达式
块表达式
package cn. hanjiaxiaozhi. basic
object _05_BlockExpressionDemo {
def main( args: Array[ String ] ) : Unit = {
val a: Int = 1
val b: Int = 1
val sum1: Int = a + b
val sum2: Int = { a + b}
val sum3: Int = {
val c = a + b
val d = a + c
d
}
println( sum1)
println( sum2)
println( sum3)
}
}
判断
条件判断
1.与java不同,if else表达式有返回值
2.没有三元表达式
3.如果返回值类型不同,就返回Any类型;如果没有返回值类型,使用Unit,相当于java中的void
package cn. hanjiaxiaozhi. basic
object _06_ConditionDemo {
def main( args: Array[ String ] ) : Unit = {
val age: Int = 18
if ( age >= 18 ) {
println( "已成年" )
} else {
println( "未成年" )
}
val result: String = if ( age >= 18 ) {
"已成年"
} else {
"未成年"
}
println( result)
val result2: Any = if ( age >= 18 ) {
1
} else {
"0"
}
println( result2)
val result3: Any = if ( age < 18 ) {
1
} else {
( )
}
println( result3)
}
}
循环
i <- 1to/until 10 by 2 1.循环没有返回值 2.多重循环以分号隔开,与判断结合使用时不需要隔开 3.推导式yield可以生成新的一组数据
简单for 循环:
for ( 变量 <- 表达式/ 数组/ 集合) { 循环体}
for ( i <- 1 to 10 ) println( i)
●嵌套for 循环
for ( 变量1 <- 表达式/ 数组/ 集合; 变量2 <- 表达式/ 数组/ 集合) { 循环体}
for ( i <- 1 to 9 ; j <- 1 to 9 ) {
if ( i >= j ) print( s " ${ j } * ${ i } = ${ j* i } " )
if ( j == 9 ) println( )
}
●守卫
for 表达式中,可以添加if 判断语句,这个if 判断就称之为守卫。我们可以使用守卫让for 表达式更简洁。
for ( i <- 表达式/ 数组/ 集合 if 表达式) { 循环体}
for ( i <- 1 to 10 if i % 3 == 0 ) println( i)
●for 推导式
在for 循环体中,可以使用yield 表达式构建出一个集合,我们把使用yield 的for 表达式称之为推导式
即可以使用for 推导式生成一个新的集合(一组数据)
val l = for ( i <- 1 to 10 ) yield i * 10
package cn. hanjiaxiaozhi. basic
object _07_LoopDemo {
def main( args: Array[ String ] ) : Unit = {
for ( i <- 1 to 10 ) {
println( i)
}
println( "=====================" )
for ( i <- 1 until 10 ) {
println( i)
}
println( "=====================" )
for ( i <- 1 to 10 by 2 ) {
println( i)
}
println( "==========while循环===========" )
var a = 1 ;
while ( a <= 10 ) {
println( a)
a += 1
}
println( "==========双层嵌套for循环完成99乘法表--写法1===========" )
for ( i <- 1 until 10 ) {
for ( j <- 1 until 10 ) {
if ( i >= j) {
print( s " ${ j } * ${ i } = ${ i * j } \t" )
}
}
println( )
}
println( "==========双层嵌套for循环完成99乘法表--写法2-更简洁但是可读性不好===========" )
for ( i <- 1 to 9 ; j <- 1 to 9 ) {
if ( i >= j) {
print( s " ${ j } * ${ i } = ${ i * j } \t" )
}
if ( j == i) {
println( )
}
}
println( "==========for循环和判断合并写===========" )
for ( i <- 1 to 10 if i % 2 == 0 ) println( i)
println( "==========等价于下面的===========" )
for ( i <- 1 to 10 ) {
if ( i % 2 == 0 ) {
println( i)
}
}
println( "==========注意:循环没有返回值===========" )
var n: Int = 1
val result = while ( n<= 10 ) {
n+= 1
n
}
println( n)
println( result)
val result2 = for ( i <- 1 to 10 ) {
1
}
println( result2)
}
}
循环中的break和continue
scala并没有提供break和continue来退出循环 要想使用,可以导包 import scala.util.control.Breaks._ 详解:
实现break:
import scala. util. control. Breaks. _
breakable{
for ( i <- 1 to 100 ) {
if ( i >= 20 )
break( )
else
println( i)
}
}
实现continue:
breakable{}将for表达式的循环体包含起来
for ( i <- 1 to 100 ) {
breakable{
if ( i % 10 == 0 )
break( )
else println( i)
}
}