Kotlin 中的中缀和扩展函数。Infix 有性能问题吗?

2023-06-19  本文已影响0人  蜗牛是不是牛

大家好。我希望每个人都很好。在我的文章中,我将讨论中缀函数和扩展函数,我们将研究中缀函数的性能。开始吧!

记得关注我个人简介,技术不迷路~

首先,我们可以提出以下问题:什么是扩展函数和中缀函数?我们如何使用它们?这些有什么优势吗?我们可以从第一个问题开始吗?

扩展功能

让我们选择任何数据类型。例如,我将首先使用 Integer 数据类型。大家都知道,当我们声明一个 Integer 变量时,我们可以使用 Integer 类的函数——例如 .minus().div () 等——但是,有时在我们的项目或代码中,我们可能需要使用其他的除了我们正在声明的变量类型的类中的函数之外的函数。Kotlin 提供了扩展类或具有新功能的接口的能力,而无需继承类或使用装饰器等设计模式。 简而言之,这些功能的主要目的是编写更具可读性的代码。让我们看看代码方面。

fun Int.plusTo(number: Int) : Int {  
return this + number  
}

这是一个基本的扩展函数,旨在返回(整数类型)函数参数和我们将使用此函数的变量的总和。现在是使用该功能的时候了。

val ourNumber: Int = 10 

val totalValue = ourNumber.plusTo(number = 20 ) 

println(totalValue) // 30

使用这些函数就是这么简单 :) 但我们需要了解更多细节。我们可以将此函数与可空类型一起使用。例子来了……

fun String?.checkIsNull() : Boolean {  
return this == null  
}  
  
...  
  
val ourString : String? = null  
val ourSecondString : String = "Hello W!"  
  
println("Is Null? = ${ourString.checkIsNull()}") // Gives us true  
  
println("Is Null? = ${ourSecondString.checkIsNull()}") // Gives us false

顺便说一句,我们在这个代码块中看到了它。同时,我们不必为扩展函数提供参数。

中缀函数

带有基本评论;中缀函数与扩展函数非常相似。中缀函数几乎所有的东西都是一样的,但当然也有区别。没时间等了,让我们从基本的中缀函数开始吧……

当我们想要使用中缀函数时,我们已经使用“infix”关键字进行标识。

infix fun String.isOkWithLenght(paramLenght: Int) : Boolean {  
return this.lenght > paramLenght  
}

与扩展功能非常相似,不是吗!刚刚用 infix 关键字定义了我们的函数。现在,是时候介绍如何使用……

val ourString = "Hello W!"  
  
println(ourString isOkWithLenght "Hello") // Gives True

就像扩展一样,使用这些功能就是这么容易。它使用起来非常简单,只需像写普通句子一样写下你正在使用的任何内容。只剩下一些细节。

只是对于中缀函数,我们只能使用一个参数,不能多也不能少。如果尝试这样做,您将面临错误。我们来看一下。

infix Array<Int>.swap(number1 : Int, number2 : Int){ ... } // Wrong Usage  
  
// or  
  
infix MutableList<Int>.deleteFirstIndex() { ... } // Wrong Usage

对于这些目的函数,扩展函数可能比中缀函数更好。

我们可以使用彼此嵌套的中缀和扩展函数。

infix fun String.isLenghtMore(string1 :String): Boolean {  
return this.checkIsLonger(string1 :String)  
}  
  
fun String.checkIsLonger(string2 :String) :Boolean{  
return this.lenght > string2.lenght  
}

我们也可以反过来使用。

当我们看着这一切。我们可以定义,中缀函数其实就是表达式函数。 “所以每个中缀函数都是扩展函数,但不是每个扩展函数都是中缀函数” 对于这些来说是最好的定义。

注意: Const 值不能作为扩展和中缀函数的参数给出。和常规函数一样,扩展和中缀函数在 Java 中是在后台静态定义的。

中缀函数有性能问题吗?

正如我们上面提到的,我们不能在将使用每个扩展函数的地方使用中缀函数。正如我们上面提到的,我们不能在将使用任何扩展函数的地方使用中缀函数。但是运行时间会有所不同吗?我们可以在下面的代码中检查这一点。

fun  main () {

     val startTimeExtension = System.nanoTime()
     var totalTimeExtension : Int = 0 
    for (i in  1. .1_000_000_000 ){
        totalTimeExtension += i.extensionAdd(totalTimeExtension)
    }
     val endTimeExtension = System.nanoTime()
     val durationExtension = endTimeExtension - startTimeExtension
    println( "duration extension--> $durationExtension " ) // 

    val startTimeInfix = System.nanoTime()
     var totalTimeInfix : Int =0 
    for (i in  1. .1_000_000_000 ){ 
        totalTimeInfix += i infixAdd totalTimeInfix 
    } 
    val endTimeInfix = System.nanoTime() 
    val durationInfix = endTimeInfix - startTimeInfix 
    println( "duration infix --> $durationInfix " ) 

} 

infix  fun  Int。infixAdd (number: Int ) : Int { 
    return  this + number 
} 

fun  Int。extensionAdd (数字:整数): Int { 
    return  this + number 
}

打印值

持续时间扩展 → 655426375
持续时间中缀 → 649704417

几乎没有区别。

扩展实际上是一个静态函数,其性能与任何其他静态函数相同。

中缀函数只是调用函数的另一种语法。中缀函数既可以是常规函数、成员函数,也可以是扩展函数,因此它具有与非中缀等价物相同的性能。

上一篇下一篇

猜你喜欢

热点阅读