scala中的常用语法(上)

来源:互联网 发布:未来网络的发展趋势 编辑:程序博客网 时间:2024/06/05 18:34

caseclass

也是一种class,不需要new,但是写了也没错

默认是public,可以在任何地方使用

默认实现了toString,hashCode,equals等的实现

不能被继承

提供了fatory method来方便的构造object(就是定义了参数和类型,不需要类中的构造函数了)

object:单例类,不能被new,可以直接调用方法

trait:(特征)

java通过接口实现多重继承,scala通过trait。但是trait是可以有属性和方法实现的

可以用with的方式来使用class PianoplayingTeacher extendsPerson with TTeacherwithTPianoPlayer

Sealed:主要有两个作用

修饰trait、class只能在当前文件中被继承

修饰后scala编译器在做模式匹配的时候,会检查了所有可能的情况,减少编程错误

举例:首先要理解模式匹配和case class

下面这段代码是正确的,但是如果改为sealedabstract class A,则在编译的时候会告诉你a match缺少了对D的检查,需要增加一行就对了:case _ => throw newRuntimeException("??");


extends App:

如下代码中,object是单例模式的语言层面的支持

 object HelloWorld {
     def main(args: Array[String]): Unit= {
         println("Helloworld")
     }
 }

要想实现这种功能,也可以直接继承App,这样对象体中的所有代码,都会被对象调起并立即执行一次(仅执行一次)

object HelloWorldThatExtendsApp extends App{
    println("Hello world")
}

package:java中包名是绝对的,scala中是相对的

串联式包

package com.horstmann.impatient {

 // com和com.horstmann的成员在这里是不可见的

  packagepeople {

    classPerson

    ...

  }

}

文件顶部标记

package com.horstmann.impatient

package people

class

  ...

 

// 上面的等同于

package com.horstmann.impatient {

  packagepeople {

    classPerson

    ...

  }

}

import:可以出现在文件的任何地方,作用域从开始延伸到语句块的结束

import java.awt.{Color, Font}

import java.util.{HashMap =>JavaHashMap}// 重命名成员

import java.util.{HashMap => _, _} //引入了util包的所有成员,但是HashMap被隐藏了

scala总会引入java.lang._   scala._ Predef._  最先引入java.lang,scala包会覆盖java.lang的内容,最后引入Predef包

implicit:对象类型的隐式转换,隐式参数,隐式类。如:

class A {}

class RichA(a:A) {

  def rich:Unit ={

   println("so rich....")

  }

}

object Implicit extends App {

  //隐式转换

  implicit defA2RichA(a:A) = new RichA(a)

  val a = newA

  a.rich

  //隐式参数

  deftestParam(implicit name: String) = println(name)

  implicit valname = "implicit name"

 

  testParam

 testParam("Sparking!!!!")

  //隐式类

  implicitclass Calculator(x: Int) {

    defadd(a:Int): Int = x + a

  }

 println(2.add(3))

}

 

泛型:和java类似,这样声明:classResettableQueue[T],泛型的默认值可以这样用:privatevar contents:T= _

异常声明:在函数前面声明:

@throws(classOf[JsonGenerationException])

@throws(classOf[JsonGenerationException])

@throws(classOf[IOException])

现在incognito中使用的是这种,@throws[IndexOutOfBoundsException]("当头对象不存在时")应该是引入了其他包

Unit:scala里面的Unit可以简单理解,对应到Java中的void

字符串插值:s/f/raw三种

s:替换字符串里面的变量、执行函数、做计算等,比如:

class Person(val name: String){

    def say(what: String) =s"say $what"

}

val person = new Person("Unmi")

println(s"Hello ${person.name},${person.say(person.name)}") //Hello Unmi, say Unmi

f是格式化,比如:

val height = 1.9d

val name = "James"

println(f"$name%s is $height%2.2f meters tall") // Jamesis 1.90 meters tall

raw是打印原始的字符串,比如:

println(raw"a\nb\tc")  //a\nb\tc

0 0