JetBrains开发者日见闻(二)之Kotlin1.3的新特性(Contract契约与协程篇)

本文介绍了Kotlin 1.3版本中的Coroutine协程和Contract契约新特性。Coroutine协程在1.3版本中转正,成为解决回调地狱的有效工具,尤其在Android开发中,有望替代RxJava。Kotlin/Native 1.0Beta也被提及,但在此不再详述。Contract契约是实验性特性,用于向编译器传达函数行为,以优化类型智能推导,如isNullOrBlank等函数背后的秘密。文章深入探讨了Contract契约的工作原理和使用限制,并鼓励开发者谨慎尝试和理解这一特性。
摘要由CSDN通过智能技术生成

简述:
上接上篇文章,今天我们来讲点Kotlin 1.3版本中比较时髦的东西,那么,今天就开始第二篇,看过一些大佬写关于Kotlin 1.3版本新特性的文章,基本上都是翻译了Kotlin Blog的官网博客。今天我不打算这么讲,既然今天的主题是时髦那就讲点有意思的东西。就像JetBrains开发者日上布道师Hali在讲Kotlin1.3新特性的时候完全就不用PPT的,拿起代码就是干。一起来看下今天提纲:

一、Coroutine协程转正,Kotlin/Native 1.0Beta

1、Coroutine协程的基本介绍

协程涉及内容很多,不是一句话就能讲清楚的,鉴于文章篇幅问题,所以这里不会去展开,后续会有专门系列文章去深入探讨。这里只是做个基本介绍。

  • 协程转正

Kotlin 1.3版本最重要的莫过于协程转正,协程实际上在官方的库中早就有应用,但是由于API不稳定一直在Experimental中,如果你之前就玩过协程的话,对比正式版本Coroutine API上还是有那么一点变化的。协程实际上就是轻量级的线程,一个线程中可以执行多个协程。

  • 协程作用

协程给开发者最大的感觉就是很好地解决了回调地狱的问题,在代码层面将异步的任务写成同步的调用形式。而且不会阻塞当前的线程。 对于Android开发者而言,为了比较好地解决多请求回调的问题,我们自然就想到了RxJava。RxJava确实可以在一定程度下缓解回调地狱问题,但是还是无法摆脱使用回调的事实。那么协程将带你用一个全新的方式来解决这个问题.在Android开发中Kotlin的Coroutine协程是基本可以替代RxJava,并且此次大会上来自Google中国技术团队负责人就演讲关于Corouine在Android中的使用,并且还说不久Retrofit库将支持协程中的suspend函数。此外Jake Wharton 大神写了一个Retrofit支持协程Coroutine的adapter库 retrofit2-kotlin-coroutines-adapter. 对于使用Kotlin开发Android的新项目来说,建议你不妨尝试使用Corouine来替代RxJava来用,也许你会觉得是真的爽啊。不信的话可以来看个协程在Android中应用的例子(伪代码):

suspend fun updateData(showId: Long) = coroutineScope {
   
    val localCacheDeferred = async {
   //启动一个异步任务处理本地耗时IO
        localDataStore.getShow(showId)
    }
    val remoteDataDeferred1 = async {
   //启动一个异步任务网络请求1
        remoteSource1.getShow(showId)
    }
    val remoteDataDeferred2 = async {
   //启动一个异步任务网络请求2
        remoteSource2.getShow(showId)
    }

    val localResult = localCacheDeferred.await()//调用await函数会挂起等待,直到执行任务结果返回,根本不需要出传入一个callback等待结果回来回调。
    val remoteResult1 = remoteDataDeferred1.await()
    val remoteResult2 = remoteDataDeferred2.await()
    val mergedResult = handleMerged(localResult, remoteResult1, remoteResult2)
    localDataStore.saveShow(mergedResult)
}

可以看到以上涉及到了三个异步任务,然而只需要使用await函数挂起等待结果返回即可,根本就不需要callback回调,可以看到整个代码看起来都是同步的,实际上包含三个异步任务。可以看到协程使用起来还是很爽的。

  • 3、解决回调地狱其他例子

不仅仅是Kotlin有这样的应用例子 ,如果你对JavaScript有所了解,JavaScript也是这样的,老版的JS执行异步任务一般用的是Promise或者ajax方式,一个异步执行后面总能带一个callback, 一旦涉及稍微复杂一点页面场景就出现了callback嵌套(回调地狱) 如果对ES6的语法新特性熟悉的话. 在Es6语法新增了async、await函数,也是将异步任务写成同步的调用,解决了JS中回调地狱的问题。

  • 4、其他语言中的协程

协程不仅仅是Kotlin这门语言才有,相反在它出来之前老早就有了,诸如Python中的协程还有window编程的纤程,实际上和协程差不多。记得前段时间看到国外一篇文章说Java内部也在研究一个类似协程的轻量级线程框架项目(Loom),具体仍然还在试验阶段。想想Oracle这尿性估计得到Java 14之后吧,感兴趣的可以去具体了解下。

2、Kotlin/Native 1.0Beta

关于Kotlin/Native这里就不详细介绍了,感兴趣去参考我的上篇文章JetBrains开发者日见闻(一)之Kotlin/Native 尝鲜篇,里面有很多Kotlin/Native的详细介绍。

二、有意思的Contract 契约(Experimental)

看到标题有趣的contract契约,确实挺有趣也是非常实用的一个语法点。接下来一起看下Kotlin 1.3版本带来一个好玩的语法特性Contract契约,但是cotract还是在Experimental, API后期可能有变动,建议可以提前玩玩,但是先不要引入到生产环境中.

1、为何需要Contract契约

我们都知道Kotlin中有个非常nice的功能就是类型智能推导(官方称为smart cast), 不知道小伙伴们在使用Kotlin开发的过程中有没有遇到过这样的场景,会发现有时候智能推导能够正确识别出来,有时候却失败了。
不知道大家有没有去深入研究过这个问题啊,那么这里将会给出一个例子复现那种场景,一起来看下:

  • 案例一
//在Java中定义一个生成token的函数的类,并且这个函数有可能返回null
package com.mikyou.news;

import org.jetbrains.annotations.Nullable;

public class TokenGenerator {
   
    public @Nullable String generateToken(String type) {
   
        return type.isEmpty() ? null : "2s4dfhj8aeddfduvcqopdflfgjfgfgj";
    }
}

//在Kotlin中去调用这个函数并生成可空类型String接收
import com.mikyou.news.TokenGenerator

fun main(args: Array<String>) {
   
    val token: String? = TokenGenerator().generateToken("kotlin")
    if (token != null && token.isNotBlank()) {
   //这里做判空处理
        println("token length is ${
     token.length}")//这里token.length编译正常并且就进行了smart cast
    }
}

将鼠标移动到token.length中token上编译器就会告知你已经被smart cast处理过了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊喵先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值