Scala实践14
阅读原文时间:2023年07月09日阅读:1

1、Scala的future

  • 创建future

import scala.concurrent._
import ExecutionContext.Implicits.global
object FutureTest {
val f:Future[String]=Future{"Hello World!"}
}

  • 提供异步

Java中的Future并不是全异步的,当需要Future里的值的时候,只能用get去获取它,亦或者不断访问Future的状态,若完成再去取值,

但其意义上便不是真正的异步了,它在获取值的时候是一个阻塞的操作,当然也就无法执行其他的操作,直到结果返回。

但在Scala中,则无需担心,虽然它也提供了类似Java中获取值的方式,如下:

Future

Java

Scala

判断任务是否完成

isDone

isCompleted

获取值

get

value

但是在Scala中可以利用Callback(回调)==》onComplete(或者onSuccess/onFailure)来获取它的结果:

val f: Future[List[String]] = Future {
session.getRecentPosts
}

f onComplete {
case Success(posts) => for (post <- posts) println(post) case Failure(t) => println("An error has occured: " + t.getMessage)
}

2、包

Scala的代码采用了Java平台完整的包机制。可用两种方法把代码放在命名包内。

  • 一种是通过把package子句放在文件顶端的方式把整个文件内容放进包里。把文件的全部内容放进包里。如:

package bobsrockets.navigation

class Navigator

  • 另一种是把代码放进包里的方式更像C#的命名空间。可以在package子句之后把要放到包里的定义用花括号括起来,即同一个文件嵌入不同的包

    package bobsrockets.navigation{

//在bobsrockets.navigation包中

class Navigator

package test{

//在bobsrockets.navigation.test包中

class NavigatorSuite

}

}

  • 常有惯例把包名和包含文件的目录相同,但是Scala和文件的布局无关。sbt项目的目录(package users)结构大概如下:

- ExampleProject

  • build.sbt
  • project
  • src
    • main
      • scala
      • users //Scala目录从这里开始
        User.scala
        UserProfile.scala
        UserPreferences.scala
    • test

3、包对象  

包可以包含类、对象和特质,但不能包含函数或变量的定义。把工具函数或常量添加到包而不是某个Utils对象,这是更加合理的做法。包对象的出现正是为了解决这个局限。每个包都可以有一个包对象。

  • 需要在父包中定义它,且名称与子包一样。

package com.nick.impatient

package object people {//包对象
val defaultName = "Nick"
}
package people {
class Person {
var name = defaultName // 从包对象拿到的常置
}
}

4、引用

在Scala中,import语句可以出现在任何地方,并不仅限于文件顶部。import语句的效果一直延伸到包含该语句的块末尾:这是个很有用的特性。并且可引用其他成员(类,特征,函数等)。

尤其是对于通配(_)引入而言。通过将引入放置在需要这些引入的地方,减少可能的名称冲突。

import users._ // 引用包users里面的所有
import users.User // 引用users包里的类 User
import users.{User, UserPreferences} // 引入被选中的User和UserPreferences
import users.{UserPreferences => UPrefs} //引入重命名的

5、注解

注解就是标签,标签是用来标记某些代码需要特殊处理的。可以在代码运行时和编译时操作。

  • 类、方法、字段局部变量、参数、表达式、类型参数以及各种类型定义

@Entity class Student

@Test def play() {}

@BeanProperty var username = _

def doSomething(@NotNull message: String) {}

@BeanProperty @Id var username = _

  • 构造器,需要在主构造器之前,类名之后,且需要加括号,如果注解有参数,则写在注解括号里面

class Student @Inject() (var username: String, var password: String)

  • 为表达式添加注解

(map1.get(key): @unchecked) match {…}

  • 泛型

class Student[@specialized T]

  • 实际类型

String @cps[Unit]

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章