首页 > 其他分享 >kotlin标准函数let apply等分析

kotlin标准函数let apply等分析

时间:2024-07-15 15:52:11浏览次数:9  
标签:kotlin contract let apply fun inline 方法 public block

在kotlin中,在standard.kt中定义了一些标准的方法,这里对这些方法进行挨个的阅读

TODO方法

这方法比较简单,就是直接抛出一个异常,这里有一个inline关键字,定义的是一个内联方法,内联方法的意思是调用时整个方法的代码一起替换过去,下面是TODO方法的源码

public inline fun TODO(): Nothing = throw NotImplementedError()
public inline fun TODO(reason: String): Nothing = throw NotImplementedError("An operation is not implemented: $reason")

 run方法

在看run方法时,我们先忽略掉contract方法来看,后面单独看contract,下面我把解释写在里面的代码中

总结:run方法接收一个block函数,并且在里面调用,并把block的返回值返回回来
@kotlin.internal.InlineOnly
//inline 内联函数
//<R> 定义的泛型R
//block: ()->R 参数名block, ()->R为block参数的类型, 是一个函数类型,函数没有参数,返回值是泛型类型的对象
//return block() 返回值是调用block函数返回的R对象
//总结:run方法接收一个block函数,并且在里面调用,并把block的返回值返回回来 public inline fun <R> run(block: () -> R): R { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } return block() } @kotlin.internal.InlineOnly public inline fun <T, R> T.run(block: T.() -> R): R { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } return block() }

with方法:

总结:with方法接收一个T类型的receiver和一个T的扩展方法,返回在传入的receiver中调用的扩展方法的返回值

@kotlin.internal.InlineOnly
//inline 内联函数
//<T,R> 定义2个泛型T和R
//receiver: T 泛型类型T类型的参数receiver
//
block: T.()->R 函数类型的参数block,不过这个方法是通过扩展方法的方式定义的,这样在内部就可以拥有T的上下文
//return receiver.block() 返回值是调用T.block函数返回的R对象
//总结:with方法接收一个T类型的receiver和一个T的扩展方法,返回在传入的receiver中调用的扩展方法的返回值
public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
  contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }
  return receiver.block()
}

apply方法

总结: apply方法是在T类型上面扩展的,接收的也是一个T类型的函数,作用是让block拥有T对象的上下文,并且返回T对象本身,这样在block中可以直接调用T里面的方法和属性

public inline fun <T> T.apply(block: T.() -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block()
    return this
}

 

also方法

总结:给T类型扩展一个also方法,这个方法也是执行block方法并返回T对象自身,和apply的区别只是把T作为参数传入

@kotlin.internal.InlineOnly
@SinceKotlin("1.1")
//T.also 表示是T类型的扩展方法,
//block: (T)->Unit 参数是一个接收一个T对象参数的方法,没有返回值
public inline fun <T> T.also(block: (T) -> Unit): T { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } block(this) return this }

 

let方法

let方法与also方法比较相似,区别只是返回值不同,also是返回T对象本身,let是返回block返回的对象R

@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block(this)
}

 

takeIf方法

takeIf根据predicate方法返回的是否是true来确定返回T对象本身还是返回null

public inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? {
    contract {
        callsInPlace(predicate, InvocationKind.EXACTLY_ONCE)
    }
    return if (predicate(this)) this else null
}

 takeUnless方法

与takeIf相反,predicate是true,返回null

public inline fun <T> T.takeUnless(predicate: (T) -> Boolean): T? {
    contract {
        callsInPlace(predicate, InvocationKind.EXACTLY_ONCE)
    }
    return if (!predicate(this)) this else null
}

 repeat方法

根据传入的times重复执行action times次

public inline fun repeat(times: Int, action: (Int) -> Unit) {
    contract { callsInPlace(action) }

    for (index in 0 until times) {
        action(index)
    }
}

  

 

标签:kotlin,contract,let,apply,fun,inline,方法,public,block
From: https://www.cnblogs.com/codermuyi/p/18303321

相关文章

  • Theia 版 CCS 之 Delete 的工程去哪里了?
    当CCS左侧工程列表框达到一定数量时,为了方便观看,大部分人会选择在工程框里删除删除方式如下选中工程右键之后选择Delete最后选择OK你跟着我的步骤来了吗?那你就大错特错啦!等到你下次再打开这个工程的时候你会发现这个工程完全没有你编写的程序你写的程序不见了!!!那么你......
  • 【译】The danger of TaskCompletionSource class
    来自SergeyTepliakov的另一篇https://devblogs.microsoft.com/premier-developer/the-danger-of-taskcompletionsourcet-class/#comments当使用async/await时,如果您想手动控制任务的生存期,TaskCompletionSource<T>类是一个非常有用的工具。下面是TaskCompletionSource的一个......
  • pthon中pyglet框架的使用方法
    pyglet框架的使用方法可以分为以下几个步骤:一、安装pyglet首先,需要通过pip安装pyglet。在命令行中输入以下命令:pipinstallpyglet确保Python环境配置正确,以便顺利安装pyglet库。二、创建窗口使用pyglet创建游戏窗口是游戏开发的第一步。以下是一个简单的示例代码,展......
  • 设计模式 - Singleton pattern 单例模式
    文章目录定义单例模式的实现构成构成UML图单例模式的六种实现懒汉式-线程不安全懒汉式-线程安全饿汉式-线程安全双重校验锁-线程安全静态内部类实现枚举实现总结其他设计模式文章:定义单例模式是一种创建型设计模式,它用来保证一个类只有一个实例,并且提供一个访问......
  • JavaWeb开发基础Servlet简介
    Servlet是什么?现在的JavaWeb开发,很少直接接触到Servlet。在Spring项目中,SpringBoot基于SpringFramework,简化了Spring应用程序开发,SpringFramework是一个全面的Java应用程序框架,其中包含SpringMVC模块,SpringMVC封装了Servlet,以实现Web功能。Servlet不属于Spirng项目,而是Jav......
  • Kotlin标准函数(语法糖)let with run also apply快速讲解
    目录1、知识储备——扩展函数原理定义扩展函数调用扩展函数2、返回值为上下文对象的标准函数applyalso3、返回值为Lambda表达式结果letrunwith4、一表总结1、知识储备——扩展函数原理Kotlin在不继承父类或实现接口下,也能扩展一个类的新功能定义扩展函数f......
  • 申请Let's Encrypt免费SSL证书
    Let'sEncrypt是一个免费的、开源的、自动化的证书颁发机构(CA),它的出现极大地推动了HTTPS的普及,为互联网的安全做出了巨大的贡献。通过来此加密网站可以免费申请Let'sEncrypt证书。Let'sEncrypt免费SSL证书申请步骤1.登录来此加密网站,输入域名,可以勾选泛域名和包含根域。2......
  • servletStudy
    servletStudy,完成添加成绩的接口遇到的问题:1.不会写获取请求体的数据的方法,通过ai查得代码,要知道ai给的代码的意思2.不知道每一个代码块的输入输出,此代码块之外的是输入,此代码内定义的是输出3.数据封装进对象的方法,new出对象,set方法4.mybatis的基本操作,忘了commit的操作排......
  • Java中的CompletableFuture详解
    Java中的CompletableFuture详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代Java编程中,异步编程变得越来越重要。Java8引入了CompletableFuture,它极大地简化了异步编程的复杂性。CompletableFuture不仅支持异步操作,还提供了丰富的API来处理异步......
  • Let‘s Encrypt免费安全证书的步骤及使用
    网站安全现已成为每个在线业务的重要考虑因素。为了确保网站与用户之间的通信安全,SSL/TLS证书发挥着至关重要的作用。申请Let'sEncrypt域名SSL证书步骤1、登录来此加密网站,输入域名,可以勾选泛域名和包含根域。2、选择加密方式,一般选择默认就可以了,也可以自定义CSR。3、选择......