Kotlin扩展函数本质到底是什么?

待兔
• 阅读 213

Kotlin扩展函数本质到底是什么?

先说点题外话。

不知道各位朋友,你们的项目中,有没有用kotlin,但是安卓领域,新项目,几乎都是用kotlin写了。

也许后端spring那一套,估计有很多老项目还是java,个人一点粗浅的看法,kotlin用过之后,是真香。

我写文章不喜欢一堆的名词,也不喜欢啰嗦。下面直接开始。

1. 什么是扩展函数?

比如在计算大数值的时候,经过要把字符串数据转成 BigDecimal , 再作运算

如下:调用 toBD() 扩展函数,把字符串转成 BigDecimal 对象

var s = "123.02"
var bd = s.toBD()  //调用 toBD() 扩展函数

上面的 toBD() 就是扩展函数,而且是 String 的扩展函数

有人可能会问了,这种很简单啊,直接用 var bd = BigDecimal (s) , 就直接可以把字符串转成了 BigDecimal 对象

为啥还要用扩展函数呢?

  1. 首先这只是个例子,但就算是这个例子,如果 s = "helloworld.net" 呢,后端返回的值不一定是数字字符串。

    直接 var bd = BigDecimal (s) 会崩溃的。

  2. 那么用 toBD() 就不会崩溃了吗?

    toBD() 里面就可以写很多代码了,可以处理这种异常情况 。

2. 扩展函数怎么定义?

上面的 toBD() 用着简单,怎么定义呢?

  1. 在项目里面新建一个文件,比如叫 StringExt.kt

  2. 在此文件中,添加如下代码

    fun String.toBD():BigDecimal? {
    
        var bd :BigDecimal? = null
        try {
            // 这个this 就是上面的 "123.02"
              //再比如,"100".toDB(), this 就是 "100"
            bd = BigDecimal(this)  
        }catch (e:Exception) {
    
        }
    
        return bd
    }

    解释:fun String.toBD():BigDecimal?

    1. 在 String 类上添加一个 toBD() 的扩展方法,函数返回值是 BigDecimal?

      这是规定,规定就是这样写的。

      在哪个类上添加扩展方法,就XX.method()

      比如想在 Int 类上添加一个方法, 就 fun Int.xx()

总结:定义就是这么简单,不要想复杂了。记住就行了。

3. 扩展函数的本质到底是什么呢?

对于 fun String.toBD():BigDecimal? 这个扩展方法

解释:其实kotin 并没有真正的在String类里面添加一个toBD() 的方法

扩展函数只是一个kotlin的语法糖,用着方便而已。

3.1 如果不用扩展函数,怎么实现上面的需求?

很多人应该能想到,就是写一个工具类,写一个静态函数。

public class StringUtil {
    public static BigDecimal toBD(String s){
        BigDecimal bd = null;
        try {
            bd = new BigDecimal(s);
        }catch (Exception e) {

        }

        return  bd;
    }
}

使用的时候:

BigDecimal bd = StringUtil.toBD("123.02")

总结: 写到这,应该明白了,kotlin扩展函数的本质 ,就是编译器在背后生成了静态函数

当然类名就不叫 StringUtil 了,至于叫什么,本文不讨论,不增加多余信息,再说你管它叫什么呢,爱啥叫啥

3.2 再重复一遍 : kotlin扩展函数的本质,就是静态函数

4. 扩展函数有什么用

代替Java中,那一坨坨的 xxUtils 工具类用的。

通过上面的学习,应该能明白了扩展函数是啥了

如果本文对你有一点帮忙,那我还是有一点点成就感的,很开心。

如文章有问题,请指正,我改

点赞
收藏
评论区
推荐文章
布袋罗汉 布袋罗汉
1年前
IntelliJ IDEA 2023 for Mac(Java开发工具)
IntelliJIDEA2023是一款由JetBrains开发的集成开发环境(IDE),主要用于Java和其他编程语言的开发。它支持多种编程语言和技术,包括Java、Kotlin、Scala、Groovy、Android、Spring等等。IntelliJ
Stella981 Stella981
2年前
IntelliJ IDEA 、PyCharm、WebStorm、PhpStorm等JetBrains公司软件 激活的License Server本地搭建教程
一、背景IntelliJIDEA是JetBrains公司的一款IDE,主要用于java开发,可以编写Java、Groovy、Kotlin、Scala等语言,也可以直接做Android开发。!这里写图片描述(https://oscimg.oschina.net/oscnet/e09776f0be7158ee477eacb14edd0c
Stella981 Stella981
2年前
Kotlin学习笔记
1概述这篇文章首先会介绍Kotlin的特点,接着介绍Kotlin与Java的语法比较。2Kotlin特点一门现代化的编程语言可开发跨平台应用,web,Socket,安卓,js,NativeApp等静态编程语言,性能基本与原声Java相当100%兼容Java(说是兼容但实际上
Stella981 Stella981
2年前
Spring Boot与Kotlin 整合全文搜索引擎Elasticsearch
Elasticsearch在全文搜索里面基本是无敌的,在大数据里面也很有建树,完全可以当nosql(本来也是nosql)使用。这篇文章简单介绍SpringBoot使用Kotlin语言连接操作Elasticsearch。但是不会做很详细的介绍,如果要深入了解Elasticsearch在Java/kotlin中的使用,请参考我之前编写的《Elastic
Wesley13 Wesley13
2年前
Java 8 中的 Lambda 表达式 vs. Kotlin 中的 Lambda
直接上一段Kotlin的函数式编程的代码:packagecom.easykotlin.lec02funsum1(x:Int,y:Int):Int{returnxy}funsum2(x:Int,y:Int)xy//
Stella981 Stella981
2年前
Better Kotlin
本文由 南尘 授权转载发布第59次推文贺贺转眼间使用Kotlin已经有两个月了,时间不长,我也算搭上了Google宣布Kotlin作为官方支持语言的一波末班车。可能大家早已从纯Java开发Android转为了混合使用开发甚至是Kotlin开发,那你转向Kotlin的初衷又是什么呢?对于我,很简单,
Stella981 Stella981
2年前
Kotlin Primer·第五章·函数与闭包
国内目前已经有几家公司开始大规模使用Kotlin开发,沪江就是其中一个。本文来自沪江工程师之手,且看他怎么认识Kotlin,欢迎大家关注他的博客——http://kymjs.com/,也欢迎大家关注Kotlin中文博客http://www.kotliner.cn/函数与闭包的特性可以算是Kotlin语言最大的特性了
Stella981 Stella981
2年前
Spring Boot 与 Kotlin 上传文件
如果我们做一个小型的web站,而且刚好选择的kotlin和SpringBoot技术栈,那么上传文件的必不可少了,当然,如果你做一个中大型的web站,那建议你使用云存储,能省不少事情。这篇文章就介绍怎么使用kotlin和SpringBoot上传文件构建工程如果对于构建工程还不是很熟悉的可以参考《我的第一个Kotlin应用》
Stella981 Stella981
2年前
Kotlin与ButterKinfe的混合使用
在学习Kotlin开发Android应用的过程中,势必要配合很多Android的开源框架一起使用,而ButterKnife是其中可能会经常用到的一个框架。但是如果在Kotlin中直接使用ButterKnife的注解方式的话,会出现空指针的异常,导致绑定失败。那么要如何才能在Kotlin的环境中使用ButterKinfe呢?不要慌,ButterKn
Stella981 Stella981
2年前
Kotlin代码检查在美团的探索与实践
背景Kotlin有着诸多的特性,比如空指针安全、方法扩展、支持函数式编程、丰富的语法糖等。这些特性使得Kotlin的代码比Java简洁优雅许多,提高了代码的可读性和可维护性,节省了开发时间,提高了开发效率。这也是我们团队转向Kotlin的原因,但是在实际的使用过程中,我们发现看似写法简单的Kotlin代码,可能隐藏着不容忽视的额外开销。本文剖析了K
待兔
待兔
Lv1
男 · helloworld公司 · CTO - helloworld开发者社区站长
helloworld开发者社区网站站长
文章
92
粉丝
45
获赞
79