kotlin快速入坑指南(干货型文档)(代码片段)

author author     2023-01-31     252

关键词:

<p style="text-align:center;color:#42A5F5;font-size:2em;font-weight: bold;">前言

即使每天10点下班,其实需求很多,我也要用这腐朽的声带喊出:我要学习,我要写文章!!

又是一篇Kotlin的文章,为啥...还不是因为工作需要。毫无疑问,最好的学习方式是通过官方文档去学习。不过个人觉得官方文档多多少少有一些不够高效。

中文官方文档

因此这篇是从我学习的个人视角以文档的形式去输出Kotlin语言基础的学习。
不扯淡了,开整。
<p style="text-align:center;color:#42A5F5;font-size:2em;font-weight: bold;">正文

1、高阶函数

高阶函数是将函数用作参数或返回值的函数。

个人为什么把这个语言特性放在第一位,因为我觉得这是我们Java语言中所不支持的。然而这个特性基本贯穿整个Kotlin语言体系。所以个人把它放到了第一位,也希望各位小伙伴能够重视这个小小的特性。先看看一个小小的demo,感受一下这个特别特性:

// 函数定义
fun funtion(num: Int, innerFun: (Int) -> Int): Int 
    return innerFun(num)

简单解释一下上边的代码。我们先看函数定义,这里定义了一个名为funtion并且返回值为Int的函数,此外这个函数接受一个Int参数和一个函数类型的参数(这个函数需要传递一个Int参数,并且返回一个Int值)。
接下来我们调用一下:

// 函数调用
val result = funtion(1) 
    it + 666

对于Lambda来说,入参如果是一个的话可以用it来表示

说实话,第一次我看到这种调用的时候,是一脸懵逼的。不知道刚入坑的小伙伴是不是和我一样的感受?因为这种写法包含小tips:
我们的innerFun是可以被简化为一个Lambda,而当Lambda作为函数的最后一个参数时,是可以将其写在函数之外的。也就是Demo中的funtion(1)。

此外我们要注意一点,这里我们的函数实例,并没有return,这是因为。lambda 表达式中的最后一个表达式是返回值
实际上这就是相当于调用了funtion方法的俩个参数,咱们换一种传统的写法,二者是等价的:

val inner = fun(num: Int): Int 
return num + 1

val result = funtion(1, inner)

OK,接下来咱们趁热打铁,再感受感受函数操作的“骚操作”。接下来我们看一看其实情况下的用法:

// 函数定义1
fun funtion(num: Int, innerFun: (Int, Int) -&gt; Int): Int 
return innerFun(num, num + 1)

// 函数调用1(上文提到,入参为1个可以用it表示,那么俩个或者多个呢?我们可以如下,自定义)
val result = funtion(1)  num1, num2 -&gt;
num1 + num2 + 666

// 函数调用2(除了Lambda的调用方式,我们还可以用匿名函数,二者是一样的)
val result = funtion(1, fun(num1: Int, num2: Int): Int 
return num1 + num2 + 666

OK,关于高阶函数的内容,就聊这么多,因为有了这个其实,很多内容也就很好上手了。接下来就让我们一同看看基于高阶函数的内置封装。

2、操作符

集合操作符

个人觉得,Kotlin操作符中。开发中颇为常用的是集合操作符,比如我们有时需要对一些数据进行连续的转化,我们可能会使用RxJava;

Observable.create(new ObservableOnSubscribe<List<CustomModel>>() 
            @Override
            public void subscribe(ObservableEmitter<List<CustomModel>> e) throws Exception 
                // 省略构建List<CustomModel>
                e.onNext(data);
            
        ).flatMap(new Function<List<CustomModel>, ObservableSource<CustomModel>>() 
            @Override
            public ObservableSource<CustomModel> apply(List<CustomModel> customModels) throws Exception 
                return Observable.fromIterable(customModels);
            
        ).map(new Function<CustomModel, String>() 
            @Override
            public String apply(CustomModel customModel) throws Exception 
                return customModel.name;
            
        ).subscribe(new Consumer<String>() 
            @Override
            public void accept(String s) throws Exception 
                // 操作s
            
        );

这里简单,写了一个RxJava的Demo:我们有一个List集合,先把它一个个发送,然后把每一个数据转成String,最后去String进行处理。
而在Kotlin中,应对上述的需求,我们该怎么做?由于操作符的支持,我们可以极为方便的进行这类操作:

val data = arrayListOf<CustomModel>(// ...省略构建的过程)
val newData=data.map 
    it.name
.forEach 
    // 操作it

用法很简单,乍一看很唬人。但是其实很简单,回忆一下我们再开篇奠定的高阶函数的基础。这里其实就是调用了data的扩展函数map(拓展函数是一种语法,可以拓展现有的类。比如这个map就是拓展了Iterable,下文我们会展开它的实现)。对它进行类型转变,然后进而调用forEach自动对这个集合进行遍历。

接下来让我们点进去,看一看具体的实现:

// 注意看,这里map的**返回值**,是一个List<R>,也就是说最终将返回map后的类型集合。因此我们可以继续进行链式调用。
public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> 
    return mapTo(ArrayList<R>(collectionSizeOrDefault(10)), transform)


public inline fun <T, R, C : MutableCollection<in R>> Iterable<T>.mapTo(destination: C, transform: (T) -> R): C 
    for (item in this)
        destination.add(transform(item))
    return destination

说白了,这里的集合操作符就是把转化的实现通过参数的形式暴露出来,由我们自行去处理,其他的事情,有内部封装去做。
当然,这其中还有很多有趣的操作符,各位小伙伴可以自行去了解。不过原理都是大同小异~

3、作用域函数

上述我们聊的是作用在集合上的操作符,说白了。它们就是拓展在对应集合类上的函数而已。那么可能有小伙伴会问,有没有作用在对象上的?没错,是有的。也就是我们接下来要聊的:作用域函数

其实很常见:

"Kotlin".let
    it.toInt()

"Kotlin".run
    this.toInt()


"Kotlin".apply

"Kotlin".also


public inline fun <T, R> T.let(block: (T) -> R): R
public inline fun <T, R> T.run(block: T.() -> R): R

public inline fun <T> T.apply(block: T.() -> kotlin.Unit): T
public inline fun <T> T.also(block: (T) -> kotlin.Unit): T

咱们看一下,它们哥四个的定义,其实很清晰。这里以返回值的类型,俩俩分类:

  • let/run。这俩个函数都可以返回另一种类型;不同在于let有入参,而run没有。
  • also/apply。 这俩个函数返回值都是本身,其中apply没有入参,而also有。

    不过即使没有入参,也可以通过this,得到本身。

上述函数的作用还是挺方便的,比如:

Model model ;
// ...省略初始化过程
if(model!=null)
    // 省略大段的操作逻辑

这种写法,在kotlin中可以这么写:

model?.alse
    // 省略大段的操作逻辑

// 有需求我们可以继续调用它的作用域函数

如果你还有一些else操作,那么没辙了,kotlin中也只能老老实实if-else

当然,还有一些有趣的作用域函数,比如在Java中:

boolean isTure;
// 省略boolean判断逻辑
if(isTure)
    // 省略大段的操作逻辑

到Kotlin中可以这样来搞:

某对象.takeIf
    // boolean判断逻辑
?.
    // 省略大段的操作逻辑

// 有需求我们可以继续调用它的作用域函数

takeIf:会根据入参的函数的返回值(true/false),决定自己(takeIf)的返回值是null还是调用者。如果是false,那么就会返回null,因此这里使用?的方式继续去调用后续操作。
我个人比较喜欢作用域函数, 因为可以省略很多if。接下来我们来换个稍稍复杂的逻辑:已知一个方法,入参是一个Model,我们要判断当这个Model对象的age属性大于10,打印这个Model对象的名字。
对于Java来说,我们可能这么写:

public void fun(Model model) 
    // 写了3个if。
    if (model != null) 
        if (model.age>10)
            if (model.name!=null)
                // 打印model.name
            
        
    


class Model 
    String name;
    int age;

对于Kotlin来说,我们可以这么写:

fun funtion(model : Model)
    model?.takeIf
        it.age > 10
    ?.let
        // 打印it.name
    

是不是简洁了很多?但是单说简洁这种东西,似乎并没有什么卵用...不过写起来,真的很爽!不信,大家可以试试~~

<p style="text-align:center;color:#42A5F5;font-size:2em;font-weight: bold;">尾声

这篇文章,想聊的内容就这么多。个人认为其实理解了高阶函数,(PS:不知道为啥起了个名叫高阶函数,整得好像很高级似的。)Kotlin就可以很快的上手,并且能感受到Kotlin写起来的爽快之处~
这里的确有些安利的意味。那是因为自己最开始对新技术其实接受度并不高,总认为新东西有各种各样的问题...当自己去了头条之后,才发现身边的同事那种高昂的学习劲头,(Kotlin?对他们来说不叫新东西...Jatpack,Flutter都已经在线上项目中跑了)自己还有什么理由说:求求别更新了,我学不动了...
还是那句话:干就完了!

最好的vue组件库之vuetify的入坑指南(持续更新中)(代码片段)

目录   安装Vuetify   文档结构    快速入门    特性        样式和动画         首先先声明,个人不是什么很牛逼的大佬,只是想向那些想入坑Vuetify的前端新手或者嫌文档太长不知如何入手的人提供一些... 查看详情

ruby入坑指南(代码片段)

1.1简介Ruby语言是由松本行弘(Matz)设计,是一门通用的、面向对象的、解释型语言。1.2Ruby?RUBY?ruby?1.Ruby:用来表示编程的语言2.ruby:是指一个计算机程序,特指Ruby的解释器3.RUBY:准确来说没有这种写法,一般是简写,例如WTO.... 查看详情

rust入坑指南:海纳百川(代码片段)

今天来聊Rust中两个重要的概念:泛型和trait。很多编程语言都支持泛型,Rust也不例外,相信大家对泛型也都比较熟悉,它可以表示任意一种数据类型。trait同样不是Rust所特有的特性,它借鉴于Haskell中的Typeclass。简单来讲,Rust中... 查看详情

3.shodan新手入坑指南(代码片段)

什么是Shodan?首先,Shodan是一个搜索引擎,但它与Google这种搜索网址的搜索引擎不同,Shodan是用来搜索网络空间中在线设备的,你可以通过Shodan搜索指定的设备,或者搜索特定类型的设备,其中Shodan上最受欢迎的搜索内容是:web... 查看详情

docker入坑指南之exec(代码片段)

容器启动之后,如果我们需要进入容器内修改配置,比如mysql修改启动配置我们启动的附加参数是不是shell,这个时候就可以用dockerexec了,docker除了对image参数以外,大部分命令,可以多docker容器ID操作的,也可以对docker容器别名... 查看详情

vue入坑指南(代码片段)

不得不提的作者尤雨溪,中国人,Vue.js创作者,VueTechnology创始人,致力于Vue的研究开发。一篇关于作者的采访:https://www.jianshu.com/p/3092b382ee80附上偶像照片:关于VueVue(读音/vju?/,类似于view)是一套用于构建用户界面的渐进式框架... 查看详情

干货|elasticsearch数据建模指南(代码片段)

0、题记我在做Elasticsearch相关咨询和培训过程中,发现大家普遍更关注实战中涉及的问题,下面我选取几个常见且典型的问题,和大家一起分析一下。订单表、账单表父子文档可以实现类似SQL的左连接吗?通过canal... 查看详情

jquery入坑指南

前言  Ajax官方文档  爱jQuery  jQuery插件库  jQuery中文apiinput赋值和取值记录一下:在写一个input赋值,二话不说就直接利用了$(‘#xx‘).val()来进行取值和赋值,取值ok,赋值后利用alert显示正确,但是在... 查看详情

快速入坑es6(代码片段)

  1.js中可以声明常量吗?constes='es6'; 块级作用域//块级作用域,会报错strisnodefinedif(true)conststr='es6';console.log(str);//块级作用域,会报错strisnodefinedif(true)conststr='e 查看详情

学会python真的有高收入?盯,请查收这份入坑指南(代码片段)

...限于初学阶段,真的比不上各位大神。对于那些打算入坑Python的小伙伴,想必会有疑问,Python可以为你带来高收入吗?好了,看了这些,是不是真的就认定Python可以拿高薪?这可不一定的。就好比大家... 查看详情

android:kotlin详细入门学习指南-基础语法(代码片段)

Android:Kotlin详细入门学习指南-基础语法(一)本人也是在初学Kotlin,如有错误,请帮忙指出,持续更新Kotlin被Google官方认为是Android开发的一级编程语言自2019年GoogleI/O以来,Kotlin就成为了Android移动开发的首选。... 查看详情

博文干货|在kotlin中使用apachepulsar(代码片段)

关于ApachePulsarApachePulsar是Apache软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致... 查看详情

android:kotlin详细入门学习指南-高阶函数-基础语法(代码片段)

本人也是在初学Kotlin,如有错误,请帮忙指出,持续更新Android:Kotlin详细入门学习指南-高阶函数-基础语法(七)建议先看看前面的文章Android:Kotlin详细入门学习指南-基础语法(一)Android:Kotlin详细入门学习... 查看详情

android:kotlin详细入门学习指南-类和对象(上)-基础语法(代码片段)

本人也是在初学Kotlin,如有错误,请帮忙指出,持续更新Android:Kotlin详细入门学习指南-类和对象-基础语法(四)建议先看看前面的文章Android:Kotlin详细入门学习指南-基础语法(一)Android:Kotlin详细入门学习... 查看详情

android:kotlin详细入门学习指南-类和对象(下)-基础语法(代码片段)

本人也是在初学Kotlin,如有错误,请帮忙指出,持续更新Android:Kotlin详细入门学习指南-类和对象(下)-基础语法(五)建议先看看前面的文章Android:Kotlin详细入门学习指南-基础语法(一)Android:Kotlin详细入门学... 查看详情

kotlin快速入门:基础语法类与继承集合(代码片段)

参考书籍:《AtomicKotlin》,全英文,读起来慢,但是写得很详细,没有任何语言基础的也能看懂《第一行代码Android第三版》,第二章,有java基础的看一看就会了Kotlin中文文档,很详细,可以当... 查看详情

kotlin快速入门:基础语法类与继承集合(代码片段)

参考书籍:《AtomicKotlin》,全英文,读起来慢,但是写得很详细,没有任何语言基础的也能看懂《第一行代码Android第三版》,第二章,有java基础的看一看就会了Kotlin中文文档,很详细,可以当... 查看详情

kotlin语法入门篇章(代码片段)

Java和Kotlin数据类型对比表Java基本数据类型Kotlin对象数据类型数据类型说明intInt整形longLong长整型shortShort短整形floaFloat单精度浮点型doubleDouble双精度浮点型booleanBoolean布尔型charChar字符型byteByte字节型 点击右侧绿色按钮运行函... 查看详情