首页 > 代码库 > Scala编程进阶
Scala编程进阶
多维数组
Java
Java Map
Tuple
内部类的作用域:外部类对象
扩大内部类作用域:伴生对象
扩大内部类作用域:类型投影
内部类获取外部类的引用
package
package
import
跳出循环语句的3种方法
方法一:使用
while循环:
var flag = true
var res = 0
var n = 0
while(flag) {
res += n
n += 1
if (n == 5) {
flag = false
}
}
for循环:(高级
var flag = true
var res = 0
for (i <- 0 until 10 if flag) {
res += i
if (i == 4) flag = false
}
方法二:在嵌套函数中使用
def add_outer() = {
var res = 0
def add_inner() {
for (i <- 0 until 10){
if (i == 5){
return
}
res += i
}
}
add_inner()
res
}
方法三:使用
跟java
import scala.util.control.Breaks._
var res = 0
breakable {
for (i <- 0 until 10) {
if (i == 5) {
break;
}
res += i
}
}
多维数组
什么是多维数组?:数组的元素,还是数组,数组套数组,就是多维数组
构造指定行与列的二维数组:
val multiDimArr1 = Array.ofDim[Double](3,4)
multiDimArr1(0)(0) = 1.0
构造不规则多维数组:
val multiDimArr2 = new Array[Array[Int]](3)
multiDimArr2(0) = new Array[Int] (1)
multiDimArr2(1) = new Array[Int] (2)
multiDimArr2(2) = new Array[Int] (3)
multiDimArr2(1)(1) = 1
Java数组与Scala数组缓冲的隐式转换
Scala代码中,直接调用
importscala.collection.JavaConversions.bufferAsJavaList
import scala.collection.mutable.ArrayBuffer
val command =ArrayBuffer("javac","C:\\Users\\Administrator\\Desktop\\HelloWorld.java") //
// ProcessBuilder
val processBuilder = newProcessBuilder(command)
val process = processBuilder.start()
val res = process.waitFor()
下面是将Java
import scala.collection.JavaConversions.asScalaBuffer
import scala.collection.mutable.Buffer
// ProcessBuilder
val cmd: Buffer[String] =processBuilder.command()
Java Map与ScalaMap的隐式转换
import scala.collection.JavaConversions.mapAsScalaMap
val javaScores = new java.util.HashMap[String, Int]()
javaScores.put("Alice", 10)
javaScores.put("Bob", 3)
javaScores.put("Cindy", 8)
val scalaScores: scala.collection.mutable.Map[String,Int] = javaScores // Java Map自动隐式转换
importscala.collection.JavaConversions.mapAsJavaMap
import java.awt.font.TextAttribute._
val scalaAttrMap = Map(FAMILY ->"Serif", SIZE -> 12)
val font = new java.awt.Font(scalaAttrMap)// Scala Map自动隐式转换Java Map
Tuple拉链操作
Tuple拉链操作指的就是
zip操作,是
比如Array(v1)
合并后的Array
val students = Array("Leo","Jack", "Jen")
val scores = Array(80, 100, 90)
val studentScores = students.zip(scores)
for ((student, score) <- studentScores)
println(student + " " +score)
如果Array
studentScores.toMap
内部类的作用域:外部类对象
import scala.collection.mutable.ArrayBuffer
class Class {
class Student(val name: String)
val students = newArrayBuffer[Student]
def register(name: String) = {
new Student(name)
}
}
val c1 = new Class
val leo = c1.register("leo")
c1.students += leo
val c2 = new Class
val jack = c2.register("jack")
c1.students += jack // error: typemismatch;
扩大内部类作用域:伴生对象
object Class {
class Student(val name: String)
}
class Class {
val students = new ArrayBuffer[
def register(name: String) = {
new
}
}
val c1 = new Class
val leo = c1.register("leo")
c1.students += leo
val c2 = new Class
val jack = c2.register("jack")
c1.students += jack
扩大内部类作用域:类型投影
class Class {
class Student(val name: String)
val students = new ArrayBuffer[
def register(name: String) = {
new
}
}
val c1 = new Class
val leo = c1.register("leo")
c1.students += leo
val c2 = new Class
val jack = c2.register("jack")
c1.students += jack
内部类获取外部类的引用
class Class(val name: String) {
outer =>//名随便
class Student(valname: String) {
def introduceMyself ="Hello, I‘m " + name + ", I‘m very happy to join class " +
}
def register(name: String) = {
new Student(name)
}
}
val c1 = new Class("c1")
val leo = c1.register("leo")
leo.introduceMyself
package定义
因为要对多个同名的类进行命名空间的管理,避免同名类发生冲突
比如说,scala.collection.mutable.Map
package定义的第一种方式: 多层级
package com {
packagesn {
packagescala {
classTest {}
}
}
}
package定义的第二种方式: 串联式
package com.sn.scala {
packageservice {
classTest {}
}
}
package定义的第三种方式: 文件顶部
package com.sn.scala.service
class Test {
}
package特性
同一个包定义,可以在不同的
Test1.scala
Test2.scala
一个
Test3.scala
子包中的类,可以访问父包中的类:
Test.scala
相对包名与绝对包名:
}
定义
package内的成员,可以直接访问package对象内的成员
}
package
}
import
}
import特性一
import特性二
}
import特性三
import com.sn.scala.service.{ MyService }
import com.sn.scala.service.{ MyService=> MyServiceImpl },将导入的类进行重命名
import com.sn.scala.service.{ MyService=> _, _ },导入com.sn.scala.service
import特性四
每个scala
import java.lang._
import scala._
import Predef._
重写field的提前定义
默认情况下,如果父类中的构造函数代码用到了被子类重写(或实现)的
当父类的构造函数执行时,如果使用到了被子类实现或重写过的
}
scala> new PEStudent().classScores
res42: Array[Int] = Array()
本来我们期望的是,
此时只能使用Scala
scala> newPEStudent().classScores
res43: Array[Int]= Array(0, 0, 0)
也可以这样,但Student
}
ps.classScores
Scala的继承层级
这里我们大概知道一下
Scala中,最顶端的两个
其次是继承了Nothingtrait的Any
接着Anyvaltrait和AnyRef
Any类是个比较重要的类,其中定义了
Any类,有点像
AnyRef类,增加了一些多线程的方法,比如
对象相等性
这里,我们要知道,在
AnyRef的
AnyRef的
通常情况下,自己可以重写
此外,定义equals
如果只是想要简单地通过是否指向同一个对象实例,判定变量是否相当,那么直接使用
}
附件列表
Scala编程进阶