Kotlin 知识点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Kotlin 知识点的主要内容,如果未能解决你的问题,请参考以下文章

kotlin-从一个片段更改多个片段的小数位

如何更改片段 Kotlin

如何在kotlin的片段内显示网格视图?

如何在kotlin中从一个片段转到另一个片段?

在片段中单击按钮播放声音(Kotlin)[重复]

Kotlin学习之旅解决错误:kotlin.NotImplementedError: An operation is not implemented: Not yet implemented(代码片段