kotlin标准库中的Scope functions(作用域函数的使用)

Android开发者用Cursor写Kotlin的真实体验与避坑指南 Kotlin作为强类型、高表达力的JVM语言,其协程、DSL和编译器插件生态为AI编程工具带来独特机遇与挑战。AI代码生成的核心原理是基于上下文窗口的模式匹配与语法补全,技术价值在于显著降低样板代码编写成本,尤其在数据转换、算法实现等逻辑层;但在Android框架集成场景(如lifecycleScope绑定、Room注解、WorkManager调度)中,因缺乏完整项目语义理解而易出错。典型应用场景包括快速构建Repository骨架、生成Excel解析逻辑、补全Flow操作符等,但必须配合人工核验关键生命周 阅读详情

kotlin标准库中的Scope functions(作用域函数的使用)

The Kotlin standard library contains several functions whose sole purpose is to execute a block of code within the context of an object. When you call such a function on an object with a lambda expression provided, it forms a temporary scope. In this scope, you can access the object without its name. Such functions are called scope functions. There are five of them: let, run, with, apply, and also.

Kotlin标准库包含几个函数,其唯一目的是在对象的上下文中执行代码块。当在提供了lambda表达式的对象上调用这样的函数时,它会形成一个临时作用域。在此范围内,您可以不使用对象的名称来访问对象。这种函数称为作用域函数。其中有五种:let、run、with、apply,还有also。

Basically, these functions do the same: execute a block of code on an object. What’s different is how this object becomes available inside the block and what is the result of the whole expression.

基本上,这些函数的作用是相同的:在对象上执行一段代码。不同的是,这个对象如何在块内可用,以及整个表达式的结果是什么。

The scope functions do not introduce any new technical capabilities, but they can make your code more concise and readable.

scope函数没有引入任何新的技术功能,但它们可以使代码更加简洁易读。

作用域函数的区别

作用域函数间的区别

let

fun testLet(){
    println("=======================使用let时:使代码简洁易懂==================================")
    Person("Alice", 20, "Amsterdam").let {
        println(it)
        it.moveTo("London")
        it.incrementAge()
        println(it)
    }


    println("=======================不使用let时=============================================")
    val mAlice:Person = Person("Alice", 20, "Amsterdam")
    println(mAlice)
    mAlice.moveTo("London")
    mAlice.incrementAge()
    println(mAlice)
}


fun main() {
    val numbers = mutableListOf("one", "two", "three", "four", "five")
    val resultList = numbers.map { it.length }.filter { it > 3 }
    println(resultList)    
}

fun main() {
    val numbers = mutableListOf("one", "two", "three", "four", "five")
    numbers.map { it.length }.filter { it > 3 }.let { 
        println(it)
        // and more function calls if needed
    } 
}

//如果代码块包含单个函数并将其作为参数,则可以使用方法引用(::)而不是lambda:
fun main() {
    val numbers = mutableListOf("one", "two", "three", "four", "five")
    numbers.map { it.length }.filter { it > 3 }.let(::println)
}

//let通常用于仅使用非空值执行代码块。要对非空对象执行操作,请使用安全调用操作符?。并在其lambda中调用let。

fun main() {
    val str: String? = "Hello"   
    //processNonNullString(str)       // compilation error: str can be null
    val length = str?.let { 
        println("let() called on $it")        
        processNonNullString(it)      // OK: 'it' is not null inside '?.let { }'
        it.length
    }
}

//使用let的另一个例子是引入局部变量,以提高代码的可读性。要为上下文对象定义新变量,请将其名称作为lambda//参数提供,以便可以使用它来代替默认值。

fun main() {
    val numbers = listOf("one", "two", "three", "four")
    val modifiedFirstItem = numbers.first().let { firstItem ->
        println("The first item of the list is '$firstItem'")
        if (firstItem.length >= 5) firstItem else "!" + firstItem + "!"
    }.uppercase()
    println("First item after modifications: '$modifiedFirstItem'")
}

run

fun testRun(){
    val mPerson=Person("Alice", 20, "Amsterdam")

    mPerson.run {
        println("age=$age,city=$city")
        println(this)
    }

}

fun main() {
    val hexNumberRegex = run {
        val digits = "0-9"
        val hexDigits = "A-Fa-f"
        val sign = "+-"

        Regex("[$sign]?[$digits$hexDigits]+")
    }

    for (match in hexNumberRegex.findAll("+123 -FFFF !%*& 88 XYZ")) {
        println(match.value)
    }
}

with

//在代码中,with可以理解为“with this object,do following”
fun main() {
    val numbers = mutableListOf("one", "two", "three")
    with(numbers) {
        val firstItem = first()
        val lastItem = last()        
        println("First item: $firstItem, last item: $lastItem")
    }
}

//with的另一个用例是引入一个辅助对象,其属性或函数将用于计算值。
fun main() {
    val numbers = mutableListOf("one", "two", "three")
    val firstAndLast = with(numbers) {
        "The first element is ${first()}," +
        " the last element is ${last()}"
    }
    println(firstAndLast)
}

also

fun main() {
    val numbers = mutableListOf("one", "two", "three")
    numbers
        .also { println("The list elements before adding new one: $it") }
        .add("four")
}

/**
 * apply和also的返回值是上下文对象本身
 * 它们可以作为辅助步骤包含在调用链中:可以在它们之后继续链接同一对象上的函数调用。
 */
fun testAlso(){
    val mPerson=Person("Alice", 20, "Amsterdam").also {
        writeToLog(it)
    }
    println(mPerson)
}


fun writeToLog(message: Person) {
    println("INFO: ${message.city}")
}

apply

/**
 * apply和also的返回值是上下文对象本身
 * 它们可以作为辅助步骤包含在调用链中:可以在它们之后继续链接同一对象上的函数调用。
 */
fun testApply(){
    val mPerson=Person("Alice", 20, "Amsterdam").apply {
        age=30
        city="漯河"
    }
    println(mPerson)
}

data class Person(var name: String, var age: Int = 0, var city: String = "")

fun main() {
    val adam = Person("Adam").apply {
        age = 32
        city = "London"        
    }
    println(adam)
}

//不使用apply时
private val mPageTransformer = ViewPager2.PageTransformer { page, position ->
        val absPos = Math.abs(position)
        page.rotation = if (rotateCheckBox.isChecked) position * 360 else 0f
        page.translationX= if (translateX) absPos * 350f else 0f
        page.translationY= if (translateY) absPos * 500f else 0f
        if (scaleCheckBox.isChecked) {
            val scale = if (absPos > 1) 0F else 1 - absPos
            page.scaleX = scale
            page.scaleY = scale
        } else {
            page.scaleX = 1f
            page.scaleY = 1f
        }
    }

//使用apply时
    private val mAnimator = ViewPager2.PageTransformer { page, position ->
        val absPos = Math.abs(position)
        page.apply {
            rotation = if (rotateCheckBox.isChecked) position * 360 else 0f
            translationY = if (translateY) absPos * 500f else 0f
            translationX = if (translateX) absPos * 350f else 0f
            if (scaleCheckBox.isChecked) {
                val scale = if (absPos > 1) 0F else 1 - absPos
                scaleX = scale
                scaleY = scale
            } else {
                scaleX = 1f
                scaleY = 1f
            }
        }
    }
Kotlin:lifecycleScope与GlobalScope以及MainScope的区别,详细分析为什么在Android中推荐使用lifecycleScope! 目录简要GlobalScopeMainScope()lifecycleScopelifecycleScope剩余问题分析(感兴趣的可以继续看) 简要 首先简要介绍一下kotlin协程作用域的三种类型。 类型 产生方式 异常传播特征 顶级作用域 GlobalScope创建 异常不向外传播。异常到达顶级作用域后,如果还没有被处理,会抛给当前的exceptionHandler,如果没有则给当前线程的uncaughtExceptionHandler 协同作用域 Job嵌套、coroutineSc 阅读详情

相关推荐

Kotlin在Android开发中的核心利器:深入探索also函数的附加操作

本文全面解析Kotlin中的also函数,从基础概念到高级应用。作为scope functions家族成员,also函数专为"附加操作"设计,能在不影响对象上下文的情况下执行额外步骤并返回原对象。文章详细对比also与apply、let等函数的区别,通过Android开发中的UI设置、数据库操作等实战案例展示其应用场景。同时提供链式调用优化、性能考量等高级技巧,以及常见面试问题解答。

郑伟强dev的专栏 32

深潜Kotlin协程(二十二):Flow的处理

系列电子书:传送门我们将 Flow 描述为一个管道,值在上面流动,流动时,这些值可以以不同的方式进行更改:删除、相乘、转换或合并。这些在 Flow 被创建到终端操作之间的所有操作称为Flow的处理。在本章中,我们将学习用于此目的的函数。这里提供的函数可能会让你想起用于处理集合的函数,这并不是巧合,因为都代表了相同的概念。不同的是 flow 上的元素可以按时传递。我们需要学习的第一个重要函数就是 。它根据转换函数对流动的每个元素进行变换。假如你有一个整型数据流,你的 操作是计算这些数字的平方,那么最终流上的

RikkaTheWorld 2353

AI驱动全栈开发实战:基于Spec与Codex的规格驱动开发指南

1. 先搞清楚“AI重构前端全栈”到底在解决什么实际问题 最近很多人在聊“AI重构前端全栈”,听起来像是又一个营销概念。但如果你真的拆开看,它核心解决的是一个非常具体且痛苦的问题: 一个开发者,如何从零开始,系统性地、不跑偏地完成一个完整项目,并且保证代码质量和架构一致性。 传统开发流程里,产品经理出PRD,前后端开会对齐,前端画页面,后端写接口,测试再介入。这个过程沟通成本高,文档容易过时,新人上手慢。而“AI重构”的思路,是试图用一套 规范化的指令(Spec) 来驱动AI(比如Codex这类模型)生成代

weixin_30596023的博客 460

【Kotlin Flow】 一眼看全——Flow操作符大全

Kotlin Flow 基本上可以替代RxJava,其提供了诸多操作符来处理数据。本篇文章为其分一下类,演示下基本用法。 弃用的方法就不罗列了。 Ctrl + F 快速查找 前置资料 冷流 🥶 冷指的是 无消费者时 则不会生产数据 热流 🥵 热指的是 无观察者时 也会生产数据 Flow分类 一般 Flow 一般的Fow , 仅有一个观察者 。冷流 。 //构建 val testFlow = flow<String>{ emit("hello")

chuyouyinghe的专栏 1989

LeGO-LOAM运行kitti数据集

文章目录1. kitti-lego-loam2. 改动3. 实验结果4. evo轨迹测评 1. kitti-lego-loam 链接:kitti-lego-loam kitti-lego-loam提供了将kitti序列转化成rosbag的代码,在kittibag中. 需要注意下数据文件的存放顺序,以00序列为例: datafolder          |____results          &

Zlp19970106的博客 8704

配电网故障重构/孤岛划分/故障恢复

程序主要复现《基于GA_BFGS算法的配电网故障恢复性重构研究_郑海广》,采用matlab编程软件实现,依据网络结构和DG供电方式对配电网进行孤岛划分,将含有 DG 的配电网拓扑结构看成一个树,搭建成连通图模型,使得将孤岛的划分变成了求取最小生成树,以网损和开关开断次数作为目标,采用 IEEE33 节点配电网为算例,通过遗传算法寻优计算,从而得到最佳的重构方案。

zhangxd212489的博客 2500

kotlin各种Scope,MainScope/GlobalScope/viewModelScope/lifecycleScope/runBlocking/withContext

lifecycleScope是一个CoroutineScope的实例,它的生命周期与LifecycleOwner(通常是Activity或Fragment)的生命周期相同。lifecycleScope通常用于执行与Activity或Fragment相关的异步操作,例如启动Activity或Fragment时执行的异步任务。MainScope的生命周期通常是Activity或Fragment的生命周期,当它们被销毁时,MainScope也会被取消。

AdrianAndroid的专栏 3277

winget安装提示:执行此命令时发生意外错误: InternetOpenUrl() failed. 0x80072efd

当我们使用Winget包管理器安装应用,提示错误:执行此命令时发生意外错误: InternetOpenUrl() failed. 0x80072efd 该怎么处理呢?请听我娓娓道来。

Linux I Tell U 8136

「Kotlin作用域函数 - Scope Functions」

Kotlin作用域函数,let()、run()、with()、apply()、also()差异比较与使用

我有一壶酒,足以慰风尘 872

总结所有的池化(Pooling)方法

为什么池化? 池化(Pooling)层和卷积层、全连接层一样,都是卷积神经网络的组成部分。 卷积神经网络中的卷积层会将卷积Filter应用于输入图像,以便创建特征映射来总结输入中这些特征的存在。 卷积层被证明是非常有效的,在深层模型中叠加卷积层可以让接近输入的层学习低层特征(如线条),在模型中更深(高)的层用于学习高阶或者更抽象的特征,如形状或特定对象。 卷积层特征映射输入的一个局限性是它们只能精确记录特征在输入层的位置。这意味着在输入图像中特征位置的小幅移动将导致不同的特征映射。这可以随着重新裁剪

大脸猫的博客 1万+

豆包手机为什么能自己“玩手机”?原理是什么?豆包手机系统运行机制深度解析:读屏、抓取、推理链路全拆解

作为一个每天被前端 Bug 打醒的程序员,我这一阵子在关注“豆包手机”这个关键词,刷到的相关视频简直铺天盖地。朋友们,说句实话,我一开始也只是抱着“看看热闹”的心态,最近一位博主下面的内容,不是“它能做什么”,而是。如果你之前看过很多评测,这篇文章会给你完全不一样的视角。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1014

Kotlin 如何优雅地使用 Scope Functions

一. Scope FunctionsScope Functions :The Kotlin standard library contains several funct...

Java与Android技术栈 466

CMake是什么?为什么学习CMake

CMake的主要作用和重要性,包括其在跨平台构建中的应用、如何支持多种编译器及操作系统,以及它在管理大型和复杂项目中的优势。

小鱼酱的博客 3871

优雅地使用Kotlin Scope Functions

Kotlin 本身是一种很灵活的语言,用好它来写代码不是一件容易的事情,需要不断地去学习和总结。本文仅仅是抛砖引玉,希望能给大家带来更多的启发性。

hirezy 1318

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Kotlin作用域函数(Scope Functions)

let:适合非空对象操作,返回代码块结果。run:适合对象上下文操作,返回代码块结果。also:适合操作对象并返回对象本身。apply:适合初始化或配置对象,返回对象本身。with:适合对一个对象执行多个操作,返回代码块结果。

jamesyang1624的博客 448

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

kotlin 范围函数(Scope Functions)

文章目录1 概述2 如何区别3 应用场景3.1 let3.2 with3.3 run3.4 apply3.5 also4 总结* 参考 1 概述 范围函数是一种能作用在某个对象上的 block(代码块,也可以叫闭包或匿名函数),可以在代码块中方便的引用目标对象从而达到简化代码逻辑、减少中间变量的功效。Kotlin 标准库中共有 5 个范围函数 let, run, with, apply, also...

BillionLeeGogogo 1272

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Kotlin 1.9 高阶函数实战:5种作用域函数性能与场景深度对比

本文深入解析Kotlin 1.9中五大作用域函数(let、run、with、apply、also)的性能差异与适用场景,提供详细的基准测试数据和最佳实践指南。通过对比返回值、上下文引用和空安全支持等核心维度,帮助开发者编写更优雅高效的Kotlin代码,特别适合面试准备和实际项目应用。

banglvfei0870的博客 611

Kotlin Coroutines不复杂, 我来帮你理一理

Coroutines 协程时光小说网 wap.youxs.org 最近在总结Kotlin的一些东西, 发现协程这块确实不容易说清楚. 之前的那篇就写得不好, 所以决定重写. 反复研究了官网文档和各种教程博客, 本篇内容是最基础也最主要的内容, 力求小白也能看懂并理解. Coroutines概念 Coroutines(协程), 计算机程序组件, 通过允许任务挂起和恢复执行, 来支持非抢占式...

爱无止 734

Kotlin 协程 - 协程作用域 CoroutineScope

是一个接口。用来追踪内部启动的协程,并对它们进行有组织的统一管理(结构化并发),因此不能在协程作用域外启动协程。例如当Activity销毁后,协程还在执行,此时会造成资源浪费(内存、CPU、磁盘、无用网络请求)。协程作用域被cancel()取消的话,里面的子协程都会被取消。.......................................................................................

HugMua的博客 7995

我们还应用Kotlin Scope函数运行

Scope Functions 在Kotlin中,作用域函数允许在对象的上下文中执&#3489...

专业的开发者“讨论” 359

Kotlin学习——kt里的作用域函数scope function,let,run,with,apply,also

1.Kotlin标准库函数let可用于作用域和null检查; 2.执行一个代码块并返回其结果。不同的是,在run函数中,对象是通过 this 访问的; 3.with是一个非扩展函数,可以简洁地访问其参数的成员:在引用其成员时可以省略实例名称; 4.apply在对象上执行一个代码块,并返回对象本身; 5.also工作原理与apply类似:它执行给定的块并返回调用的对象。在块内部,对象被它引用,日志打印;

Arya的博客,专注后端领域 1704

【Kotlin 协程】协程底层实现 ④ ( 结构化并发 | viewModelScope 作用域示例 )

一、viewModelScope 作用域作用、 二、viewModelScope 作用域示例

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 3158

Kotlin:lifecycleScope与GlobalScope以及MainScope的区别,详细分析为什么在Android中推荐使用lifecycleScope!(1)

首先是感觉自己的基础还是不够吧,大厂好像都喜欢问这些底层原理。之前的准备只涉及了Java、Android、计网、数据结构与算法这些方面,面对面试官对其他基础课程的考察显得捉襟见肘。下一步还是要查漏补缺,进行针对性复习。最后的最后,那套资料这次一定要全部看完,是真的太全面了,各个知识点都涵盖了,几乎我面试遇到的所有问题的知识点这里面都有!希望大家不要犯和我一样的错误呀!!!一定要看完!《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_84149557的博客 1271

一篇文章带你彻底搞懂Kotlin的协程

产生背景 为了解决异步线程产生的回调地狱 //传统回调方式 api.login(phone,psd).enquene(new Callback<User>(){ public void onSuccess(User user){ api.submitAddress(address).enquene(new Callback<Result>(){ public void onSuccess(Result result){ ... }

zhireshini233的博客 735

秒懂Kotlin之轻松掌握Scope Functions (apply, also,let,run,with)

概述 Kotlin和Java相比提供了很多语法糖,目的当然是提高程序员的编码效率,但是其中一些过于灵活的语法糖也增加了正确使用的难度,其中 Scope Functions 就属于这一类。曾几何时,面对 apply、also、let、run还有with是不是傻傻分不清?不要羞愧,因为你不是一个人! 定义 Scope Functions 是指下表中列出的5个函数,那他们为什么叫scope functions呢? 名称 定义 apply public inline fun T.apply(blo

ShuSheng007的程序人生 2161
上一篇: kotlin中lateinit关键字的使用示例
下一篇: kotlin标准库中的takeIf和takeUnless函数
cdcdec
博客等级 码龄9年 8粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值