lateinit 延遲加載,lateinit 只能修飾, 非kotlin基本類型
因爲Kotlin會使用null來對每一個用lateinit修飾的屬性做初始化,而基礎類型是沒有null類型,所以無法使用lateinit。
1.lazy{} 只能用在val類型, lateinit 只能用在var類型 如 :
2.lateinit不能用在可空的屬性上和java的基本類型上 如:
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
的結果處理。
參考文檔: