Scala实践14
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]
Scala实践14的更多相关文章
- Scala实践6
1 if表达式 Scala中if...else..表达式是有返回值的,如果if和else返回值类型不一样,则返回Any类型. scala> val a3=10 a3: Int = 10 sca ...
- Scala实践7
一.类 1.1简单类和无参方法 类的定义通过class关键字实现 scala> class Dog { | private var leg = 4 | def shout(content: St ...
- Scala实践5
一.Scala的层级 1.1类层级 Scala中,Any是所其他类的超类,在底端定义了一些有趣的类NULL和Nothing,是所有其他类的子类. 根类Any有两个子类:AnyVal和AnyRef.其中 ...
- es6+最佳入门实践(14)
14.模版字符串 模版字符串(template string)是增强版的字符串,定义一个模版字符串需要用到反引号 let s = `这是一个模版字符串` console.log(s) 14.1.模版字 ...
- Scala实践13
1.隐式参数 方法可以具有隐式参数列表,由参数列表开头的implicit关键字标记.如果该参数列表中的参数没有像往常一样传递,Scala将查看它是否可以获得正确类型的隐式值,如果可以,则自动传递. S ...
- Scala实践12
1.内部类和抽象类型成员作为对象成员 内部类 在Scala中,可以让类将其他类作为成员.这些内部类是封闭类的成员.在Scala中,这样的内部类绑定到外部对象.假设希望编译器在编译时阻止我们混合哪些节点 ...
- Scala实践11
1.1泛型类 泛型类是将类型作为参数的类.它们对集合类特别有用. 定义泛类型:泛型类将类型作为方括号内的参数[].一种惯例是使用字母A作为类型参数标识符,但是可以使用任何参数名称. class Sta ...
- Scala实践10
1.模式匹配 模式匹配是一种根据模式检查值的机制.它是switch(Java中语句)的更强大版本,它同样可以用来代替一系列if / else语句. 句法 匹配表达式具有值,match关键字和至少一个c ...
- Scala实践9
1.特征 Traits用于在类之间共享接口和字段.它们类似于Java 8的接口.类和对象可以扩展特征,但是特征不能被实例化,因此没有参数. 定义一个特征 最小特征只是关键字trait和标识符: tra ...
随机推荐
- 零基础入门--中文命名实体识别(BiLSTM+CRF模型,含代码)
自己也是一个初学者,主要是总结一下最近的学习,大佬见笑. 中文分词说到命名实体抽取,先要了解一下基于字标注的中文分词.比如一句话 "我爱北京天安门”. 分词的结果可以是 “我/爱/北京/天安 ...
- 前端开发工具之jQuery
jQuery jQuery是一个轻量级的JavaScript第三方库,能够简单方便的进行JavaScript编程. jQuery选择器 1,id选择器: $("#id") 2,标签 ...
- httpClient Post例子,Http 四种请求访问代码 HttpGet HttpPost HttpPut HttpDelete
httpclient post方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 //----1. HttpPost request = new HttpPost(ur ...
- java用普通类如何实现枚举功能
用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能. 1.私有的构造方法. 2.每个元素分别用一个公有的静态成员变量表示. 可以有若干公有方法或抽象方法.采用 ...
- P1020 从大到小排序
题目描述 给你n个整数,请你按照从大到小的顺序输出它们. 输入格式 输入的第一行包含一个整数 \(n(1 \le n \le 10^3)\) ,用于表示元素的个数. 输入的第二行包含 \(n\) 个整 ...
- linux 读者/写者旗标
旗标为所有调用者进行互斥, 不管每个线程可能想做什么. 然而, 很多任务分为 2 种清 楚的类型: 只需要读取被保护的数据结构的类型, 和必须做改变的类型. 允许多个并发读 者常常是可能的, 只要没有 ...
- centos7中安装R之前yum依赖的包
#!/bin/bash echo "#########################开始安装依赖环境#####################" yum -y install g ...
- Array数组的常用方法
1.concat()链接数组 var a = [1,2,3]; console.log(a.concat(4,5));//[1,2,3,4,5] 2.join()分隔符链接数组变字符串,如果省略该参数 ...
- 一道非常棘手的 Java 面试题:i++ 是线程安全的吗
转载自 一道非常棘手的 Java 面试题:i++ 是线程安全的吗 i++ 是线程安全的吗? 相信很多中高级的 Java 面试者都遇到过这个问题,很多对这个不是很清楚的肯定是一脸蒙逼.内心肯定还在质疑 ...
- vue-learning:2 - template - directive
指令 directive 在上一节我们知道,VUE的template模板通过VUE指令API实现与页面的视图层联系.所以本节将聚集在实现视图层交互的VUE指令系统directive的基础使用. 我们先 ...