Kotlin 知識點

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

https://segmentfault.com/a/1190000006098059 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章