解析Kotlin中的Lambda【笔记摘要】
先看实例:
fun b(param: Int): String {return param.toString()
}fun a(funParam: (Int) -> String): String {return funParam(1)
}
a(::b)
val d = ::b
1.双冒号 ::method 到底是什么?答:一个指向和该函数具有相同功能的对象的引用
因为加了两个冒号,这个函数才变成了一个对象。函数不是对象,它也没有类型,函数就是函数,它和对象是两个维度的东西。
在 Kotlin 里,一个函数名的左边加上双冒号,它就不表示这个函数本身了,而表示一个对象,或者说一个指向对象的引用,但,这个对象可不是函数本身,而是一个和这个函数具有相同功能的对象。
b(1) // 调用函数
d(1) // 用对象 a 后面加上括号来实现 b() 的等价操作
(::b)(1) // 用对象 :b 后面加上括号来实现 b() 的等价操作
对象是不能加个括号来调用的,对吧?但是函数类型的对象可以。为什么?因为这其实是个假的调用,它是 Kotlin 的语法糖,实际上你对一个函数类型的对象加括号、加参数,它真正调用的是这个对象的 invoke() 函数
d(1) // 实际上会调用 d.invoke(1)
(::b)(1) // 实际上会调用 (::b).invoke(1)
所以你可以对一个函数类型的对象调用 invoke(),但不能对一个函数这么做:
b.invoke(1) // 报错
2.匿名函数
要传一个函数类型的参数,或者把一个函数类型的对象赋值给变量,除了用双冒号来拿现成的函数使用,你还可以直接把这个函数挪过来写:
a(fun b(param: Int): String {return param.toString()
});
val d = fun b(param: Int): String {return param.toString()
}
另外,这种写法的话,函数的名字其实就没用了,所以你可以把它省掉:
a(fun(param: Int): String {return param.toString()
});
val d = fun(param: Int): String {return param.toString()
}
这种写法叫做匿名函数。(实际上函数的名字是必须省略的,这是Kotlin规定的)
3.Lambda 表达式
A.如果 Lambda 是函数的最后一个参数,你可以把 Lambda 写在括号的外面:
view.setOnClickListener() { v: View ->switchToNextPage()
}
B.而如果 Lambda 是函数唯一的参数,你还可以直接把括号去了:
view.setOnClickListener { v: View ->switchToNextPage()
}
C.如果参数的类型可以推断,那么可以将类型去掉
view.setOnClickListener { v ->switchToNextPage()
}
D.如果这个 Lambda 是单参数的,它的这个参数也可以省略掉不写:(因为 Kotlin 的 Lambda 对于省略的唯一参数有默认的名字:it)
view.setOnClickListener {switchToNextPage()
}
为什么C可以省略参数类型?靠上下文的推断。我调用的函数在声明的地方有明确的参数信息吧?所以 Lambda 才不用写的。
fun setOnClickListener(onClick: (View) -> Unit) {this.onClick = onClick
}
当把Lambda赋值给变量时,就不能省略掉 Lambda 的参数类型了,因为它无法从上下文中推断出这个参数的类型
//报错:Cannot infer a type for this parameter. Please specify it explicitly.
val h = { param -> param.toString()
}
如果你出于场景的需求或者个人偏好,就是想在这里省掉参数类型,那你需要给左边的变量指明类型:
val h: (Int) -> String = { param ->param.toString()
}
注意: Lambda 的返回值不是用 return 来返回,而是直接取最后一行代码的值。如果你写了return,它会用这个return返回它外层的函数
4.Kotlin 里匿名函数和 Lambda 表达式的本质
双冒号加函数名、Kotlin 的匿名函数和 Lambda 表达式的本质,它们都是函数类型的对象,它们和函数不是一回事。函数并不能传递,传递的是对象
参考文章:
Kotlin 的 Lambda 表达式,大多数人学得连皮毛都不算
相关文章:

解析Kotlin中的Lambda【笔记摘要】
先看实例: fun b(param: Int): String {return param.toString() }fun a(funParam: (Int) -> String): String {return funParam(1) }a(::b) val d ::b1.双冒号 ::method 到底是什么?答:一个指向和该函数具有相同功能的对象的引用 因为…...

rust单元测试顺序执行
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 存在的问题 有时候,不同单元测试之间可能会竞争相同的资源,比如读写相同的文件。在这种情况下,如果…...

力扣-744. 寻找比目标字母大的最小字母
文章目录 力扣题目代码工程 力扣题目 给你一个字符数组 letters,该数组按非递减顺序排序,以及一个字符 target。letters 里至少有两个不同的字符。 返回 letters 中大于 target 的最小的字符。如果不存在这样的字符,则返回 letters 的第一个…...

一篇文章搞懂弹性云服务器和轻量云服务器的区别
前言 在众多的云服务器类型中,弹性云服务器和轻量云服务器因其各自的特点和优势,受到了广大用户的青睐。那么,这两者之间到底有哪些区别呢?本文将为您详细解析。 弹性云服务器:灵活多变的计算资源池 弹性云服务器&…...

横穿自动驾驶
如果有一条线,可以穿起来所有自动驾驶的核心模块,那么我感觉它就是最优化,选择优化变量、构造优化问题、求解优化问题,这几个步骤贯穿了自动驾驶的始终。 先从我的自身接触顺序写起。最开始做个一点深度学习,那还是20…...

为什么网上商店需要翻译成其他语言
网上商店不仅仅是一个可以买到商品的网站。它是一个完整的电子商务平台,为来自世界各地的用户提供购买所需物品的机会。但是,为了让这些用户舒适地使用网站,需要高质量的翻译和本地化。 本地化是指产品或服务适应特定文化或市场的过程。它包…...

【高考志愿】交通运输工程
目录 一、专业概述 二、课程设置 三、就业前景 四、报考注意 五、未来发展 六、交通运输工程专业排名 高考志愿选择交通运输工程专业,无疑是一个既具远见又富有挑战性的决定。这个专业以其综合性强、实用性高的特点,吸引了大批有志于投身交通事业的…...

【深度学习】【Lora训练3】StabelDiffusion,Lora训练过程,秋叶包,Linux,SDXL Lora训练
为了便于使用,构建一个docker镜像来使用秋叶包。2024年6月26日。 docker run -it --gpus all -v /ssd/xiedong:/datax --net host kevinchina/deeplearning:pytorch2.3.0-cuda12.1-cudnn8-devel-xformers bashgit clone --recurse-submodules https://github.com/A…...

ubuntu系统下如何安装python
在Ubuntu系统下安装Python,有多种方法可供选择。以下是两种常见的方法: 一、使用apt包管理器安装 安装步骤如下: 首先更新软件包列表 sudo apt update安装Python 3: 输入以下命令以安装Python 3(Ubuntu的默认Pyth…...

邦芒攻略:职场中学会这五种管好情绪的方法
我们在公司里面在跟同事的一些往来,或者说是工作的一些合作当中。相信很多人都会有与周围的一些人发生过一些各种的争执,或者说是一些分歧。当然作为每一个职场的人来说,每天都是工作很累的,也是都很辛苦的,所以说…...

Linux各种命令——tac命令,more 命令, less命令,head命令,tail命令,file 命令, stat 命令
注意:tac命令是倒置输出文件内容 #### tac - **作用:倒叙访问文件内容** - 格式:tac 参数 文件名 - **例如:** **tac /etc/passwd** #### more 命令 - 作用:翻页查看文件内容,适合内容较多的文件查看…...

【Rust入门教程】hello world程序
文章目录 前言Hello World程序运行总结 前言 对于学习任何一种新的编程语言,我们都会从编写一个简单的Hello World程序开始。这是一个传统,也是一个开始。在这篇文章中,我们将一起学习如何在Rust中编写你的第一个程序:Hello Worl…...

激活函数、向前传播、损失函数、梯度下降
激活函数 作用:主要引入了非线性。从而能解决很复杂的非线性关系。能更好地处理现实世界的数据和任务。 向前传播 向前传播描述了,神经网络中,输入层到输出层的信号传播和处理过程。输入层将特征数据输入,加权求和,…...

three.js - MeshStandardMaterial(标准网格材质)- 金属贴图、粗糙贴图
金属贴图、粗糙贴图 金属贴图:metalnessMap 和 粗糙贴图:roughnessMap,是用于模拟物体表面属性的两种重要贴图技术,这两种贴图,通常与基于物理的渲染(PBR)材质(如:MeshSt…...

算法-位图与底层运算逻辑
文章目录 1. 位图的理论基础2. 完整版位图实现3. 底层的运算逻辑-位运算 1. 位图的理论基础 首先我们要理解什么是位图, 位图的一些作用是什么 位图法就是bitmap的缩写。所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又…...

黑马点评-Redis的缓存击穿,缓存雪崩,缓存穿透,互斥锁,逻辑过期
文章目录 1.缓存穿透2.缓存雪崩3.缓存击穿3.1 互斥锁3.2 基于逻辑过期 1.缓存穿透 解决办法 写入NULL值到Redis缓存,以后就会命中Redis的控制缓存而不会出现请求直接打到数据库的问题! 代码 2.缓存雪崩 这个概念很好理解,雪崩就是无数的…...

8624 多项式系数累加和
这个问题可以通过使用数学的导数规则来解决。对于一个多项式,它的导数可以通过将每一项的系数乘以它的指数,然后降低该项的指数来得到。这个过程可以重复M次来得到多项式的M阶导数。然后,我们可以简单地将所有项的系数相加来得到结果。 以下…...

使用 C# 和 OpenXML 读取大型 Excel 文件
介绍 高效读取大型 Excel 文件可能具有挑战性,尤其是在处理需要高性能和可扩展性的应用程序时。Microsoft 的 OpenXML SDK 提供了一套强大的工具来处理 Office 文档(包括 Excel 文件),而无需在服务器上安装 Excel。本文将指导您使…...

【基于R语言群体遗传学】-5-扩展到两个以上等位基因及多基因位点
我们现在继续对于群体遗传学进行统计建模,书接上回,我们讨论了孤雌生殖的物种违反哈代温伯格遗传比例的例子,那我们现在来看多于两个等位基因的情况的计算。 如果没有看过之前文章的同学,可以先去看一下之前的文章: …...

重采样(上采样或下采样)是什么?
重采样(Resampling)是在数据处理中常用的一种技术,主要用于处理数据集中的不平衡问题。具体来说,重采样可以分为上采样(Oversampling)和下采样(Undersampling),它们分别是…...

AI与Python共舞:如何利用深度学习优化推荐系统?(2)
推荐系统的前世今生 推荐系统的历史可以追溯到20世纪90年代,从最初的基于内容过滤和协同过滤,到现在融合了机器学习甚至是深度学习的混合型推荐,其目标始终如一:更精准、更个性化地为用户推荐内容。随着Python的普及,…...

ChatGPT:Java中的对象引用实现方式
ChatGPT:Java中的对象引用实现方式 如果使用句柄的话,那么 Java 堆中将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与对象类型数据各自的具体地址信息。 你提到的句柄机制是…...

云渗透实战手册:云API攻防之云服务端点侦查
在云计算环境中的渗透,与传统渗透相比,新增加了许多新的攻击面,同时也因为云计算的特点我们需要转变渗透的思维,用云计算的方式去思考云渗透。 基础知识 在云渗透开始之前,我们需要首先阐述标题中提到的云服务端点概…...

PHP 爬虫之使用 Curl库抓取淘宝商品列表数据网页的方法
使用 PHP 的 cURL 库来抓取淘宝商品列表数据网页需要谨慎,因为淘宝等电商平台通常会有反爬虫机制,以防止数据被滥用。然而,如果你只是出于学习目的,并且了解并遵守了淘宝的robots.txt文件和相关的使用条款,你可以尝试使…...

Python基础小知识问答系列-可迭代型变量赋值
1. 问题: 怎样简洁的把列表中的元素赋值给单个变量? 当需要列表中指定几个值时,剩余的变量都收集在一起,该怎么进行变量赋值? 当只需要列表中指定某几个值,其他值都忽略时,该怎么…...

主流 Canvas 库对比:Fabric.js、Konva.js 和 Pixi.js
在前端开发中,HTML5 Canvas 是一个强大的工具,可以用来创建图形、动画和各种视觉效果。为了简化和增强 Canvas 的使用,社区中出现了许多库。本文将对比三种主流的 Canvas 库:Fabric.js、Konva.js 和 Pixi.js,分析它们的…...

backbone是什么?
在深度学习中,特别是计算机视觉领域,"backbone"(骨干网络)是指用于提取特征的基础网络。它通常是卷积神经网络(CNN),其任务是从输入图像中提取高层次特征,这些特征然后被用…...

四十篇:内存巨擘对决:Redis与Memcached的深度剖析与多维对比
内存巨擘对决:Redis与Memcached的深度剖析与多维对比 1. 引言 在现代的系统架构中,内存数据库已经成为了信息处理的核心技术之一。这类数据库系统的高效性主要来源于其对数据的即时访问能力,这是因为数据直接存储在RAM中,而非传统…...

HTML5的多线程技术:Web Worker API
Web Workers API 是HTML5的一项技术,它允许在浏览器后台独立于主线程运行脚本,即允许进行多线程处理。这对于执行密集型计算任务特别有用,因为它可以防止这些任务阻塞用户界面,从而保持网页的响应性和交互性。Web Workers在自己的…...

Java | Leetcode Java题解之第206题反转链表
题目: 题解: class Solution {public ListNode reverseList(ListNode head) {if (head null || head.next null) {return head;}ListNode newHead reverseList(head.next);head.next.next head;head.next null;return newHead;} }...