Scala基础
目录
Scala基础知识变量var|val 变量名 [: 变量类型] = 变量值 ===注意=== object Hello { def main(args: Array[String]): Unit = { //类型推导 var num = 10 //类型确定后,就不能修改,说明Scala是强数据类型语言 // num = 2.3 //错误,因为scala已经推导出num就是Int类型 var age: Int = 30 //age是可以改变的 age = 50 val grade = 60 // grade = 80 //val修饰的变量不可以改变 } } scala设计者为什么设计var和val (1) 在实际的应用场景中,我们更多的需求是获取/创建一个对象后,读取该对象的属性,我们很少去改变这个对象本身,这时我们可以使用val (2) 因为val没有线程安全问题,因此效率更高,Scala设计者更加推荐我们使用val (3) 如果对象需要改变,则使用var (4) val修饰的变量在编译后,等同于加上final (5) var修饰的对象引用可以改变,val修饰的则不可改变,但对象的状态(值)缺是可以改变的。 数据类型Byte、Char、Short、Int、Long、Float、Double (无包装类型)和Boolean、Unit类型。scala中数据类型都是对象,因此每种数据类型都可以调用该对象的很多方法 ===总结=== 1) 在scala中有一个根类型Any,它是所有类的父类 2) scala中一切皆为对象,分为两大类 AnyVal(值类型),AnyRef(引用类型),它们都是Any子类 3) Null类型是scala的特别类型,它只有一个值null,它是bottom class,是所有AnyRef类型的子类 4) Nothing也是bottom class,它是所有类的子类,在开发中通常可以将Nothing类型的值返回给任意变量或者函数 //比如开发中,我们有一个方法,就会抛出异常,这时就可以返回Nothing //即当我们Nothing做返回值,就是明确说明该方法没有任何正常返回值 def sayHello: Nothing = { throw new Exception("抛出异常") } 5) 在scala中仍遵守,低精度的值,向高精度的值自动转换(implicit conversion) 隐式转换 var num = 1.2 //默认为double var num2 = 1.7f num = num2 //num2 = num //erro 修改为num2 =num.toFloat 懒值Java中并没有为惰性提供原生支持 //在x被定义的时候即被取值 val x = scala.io.Source.fromFile("*/xxx/xx").mkString //在y被首次使用时取值 lazy val y = scala.io.Source.fromFile("*/xxx/xx").mkString //在每一次x被使用时取值 def z = scala.io.Source.fromFile("/xxx/xx/x").mkString //懒值并不是没有额外开销,我们每次访问懒值,都会有一个方法被调用,而这个方法将会以线程安全的方式 //检查该值是否已被初始化 lazy不能修饰var变量 表达式s"${表达式}" {这里面可以添加表达式,注意""的前面有一个s} val name = "chenliqi" println(s"${name }") //输出chenliqi println(s"${4*4 }") //输出16 条件判断Scala中没有三元运算符 /** * if() {} else {},其中{}中最后一行代码是返回值 * if(){}else if(){} 可以不写最后的else,如果执行到最后的else, * 编译器会帮我们返回一个Unit类型,这在java中会报错! */ val t = if (i>10) i else "xxxx" //在这里编译器会将t推导为Any类型 ===注意=== 循环for循环scala中for循环这一常见的控制结构提供了非常多的特性,这些for循环的特性被称为for推导式或for表达式 //生成序列 for(ele <- array){if(ele %2 == 0) println(ele)} 双重循环 while循环和Java类似 var i = 0 while (i<10){ println("chen " + i) i += 1 } ===注意=== 循环中断在scala中并没有提供break和continue,但是util.control.Breajs,breakable提供了break import scala.util.control.Breaks.breakable import scala.util.control.Breaks //类似于break breakable{ for (ele <- 1 to 10) { if (ele == 4) Breaks.break() print(ele + " ") } } //类似于continue 其实在for中添加if else也可实现continue效果 for (ele <- 1 to 10) { breakable{ if (ele == 4) Breaks.break() print(ele + " ") } } /** * breakable的源代码 * def breakable(op: => Unit) { * try { * op * } catch { * case ex: BreakControl => * if (ex ne breakException) throw ex * } * } */ yield满足条件的返回,产生的新值放入集合中,将循环导出项链 //java中就需要list.add(ele) val tt = for (ele <- 0 to 8 ; if ele %2 == 0) yield ele println(tt) 运算符重载1 + 2 = 1.+(2) 异常Scala中不再分编译异常和运行时异常 scala的设计者并不支持“受检”异常,也就是对于声明的异常不是强制需要在程序中捕获,因为它们意识到彻底的编译器检查并不总是好的,也就是编程者觉得代码可能会出现异常就去try,编程者觉得没问题就不管了 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |