lateinit 延迟加载, lateinit 只能修饰, 非 kotlin 基本类型
因为 Kotlin 会使用 null 来对每一个用 lateinit 修饰的属性做初始化, 而基础类型是没有 null 类型, 所以无法使用 lateinit.
1.lazy{} 只能用在 val 类型, lateinit 只能用在 var 类型 如 :
val name: String by lazy {"sherlbon"}
lateinit var adapter: MyAdapter12
2.lateinit 不能用在可空的属性上和 java 的基本类型上 如:
lateinit var age: Int // 会报错 1
3.lateinit 可以在任何位置初始化并且可以初始化多次. 而 lazy 在第一次被调用时就被初始化, 想要被改变只能重新定义
4.lateinit 有支持 (反向) 域(Backing Fields)
- --------------
- awaitEvent<Long> { handler ->
- vertx.setTimer(1000, handler)
- }
- // 可以简化成
- awaitEvent<Long>{vertx.setTimer(1000, it)}
- launch(vertx.dispatcher()) {//dispatcher 可以让代码在 vertx 的 EventLoop 里运行
- awaitEvent<Long> { handler ->
- vertx.setTimer(1000, handler)
- }
- println("Event fired from timer")
- }
通过改变 launch 的参数, 使 coroutines 可以跑在 vertx 的 EventLoop 下, 通过 awaitResult 包装 vert.x 的 API 使之可以通过协程同步返回. 完成这两个功能 vert.x 就可以完美的和协程融合了. 下面我们看一个稍微复杂的例子
- val consumer = vertx.eventBus().localConsumer<String>("a.b.c")
- consumer.handler { message ->
- println("Consumer received:${message.body()}")
- message.reply("pong")
- }
- // Send a message and wait for a reply
- val reply = awaitResult<Message<String>> { h ->
- vertx.eventBus().send("a.b.c", "ping", h)
- }
- println("Reply received:${reply.body()}")
我们用了 awaitResult 这个 API 包装了 send 的最后一个参数, 这样 send 方法里的 Handler 参数可以同步的返回给 reply , 也就是说通过协程变成了同步. 然后我们就可以直接打印出 reply 里的一些数据, 整体逻辑也是线性的.
细心的朋友会发现, 这里是通过 awaitResult 而不是 awaitEvent. 这两者的区别很简单, awaitResutl 会有一个确定的返回值, awaitEvent 一般没有确定的返回值, 有也是 void 类型. 这两个方法包装了 vert.x 的两个核心 API, Handler<Void> 与
Handler<AsyncResult<T>>
coroutines, 还提供了包装 Rx 以及 FutureAPI 的功能, vert.x 里默认有自己的 Future 实现, 我们也提供了相应的转换, 而且非常简单.
- val httpServerFuture = Future.future<HttpServer>()
- vertx.createHttpServer()
- .requestHandler { req -> req.response().end("Hello!") }
- .listen(8000, httpServerFuture)
- val httpServer = httpServerFuture.await()
- println("HTTP server port:${httpServer.actualPort()}")
- val result = CompositeFuture.all(httpServerFuture, httpServerFuture).await()
- if (result.succeeded()) {
- println("The server is now running!")
- } else {
- result.cause().printStackTrace()
- }
这里通过扩展 Future 的方法 Future.await 直接将结果以同步的方式返回出来, 瞬间变得简单多了. 同理一样可以用于 CompositeFuture 的结果处理.
参考文档:
http://www.itboth.com/d/qyUbEf/java-kotlin
来源: http://www.bubuko.com/infodetail-2581071.html