Kotlin Lambda表达式和匿名函数的组合简直太强了

news2024/9/27 23:28:44

Kotlin Lambda表达式和匿名函数的组合简直太强了

简介

首先,在 Kotlin 中,函数是“第一公民”(First Class Citizen)。因此,它们可以被分配为变量的值,作为其他函数的参数传递或者函数的返回值。同样,在 Kotlin 中有两种明显的方式来将一个函数分配给一个变量(2种不同的函数字面值)。

1- Lambda 表达式

2- 匿名函数

现在,我们将查看这些主题及其解释和示例。

Lambda表达式

在Kotlin中,Lambda表达式是一个简洁的未命名函数,它被括在大括号中,用于定义可以作为值传递或存储为变量的代码块。

//Basic Usage of Lambda expression 
 var  myVariable = {  println("Inside of the Lambda Expression")  }

Lambda表达式基本用法
此外,Lambda表达式可以接受参数并返回值。现在,让我们来看一下语法。

 //Lambda Expressions can take arguments and return values.
  val myVariable: (Int, String) -> String = { a: Int, b: String -> "$a + $b" }

Lambda表达式可以接受参数并返回值
此外,当创建 Lambda 表达式时,我们可以使用更短的语法。

//There are two shorter syntax.

// 1- Skip the function type.
val myVariable = { a: Int, b: String -> "$a + $b" }

// 2- Skip the data types inside the curly brackets
val myVariable2: (Int, String) -> String = { a, b -> "$a + $b" }

最后,有四种函数类型,根据参数和返回类型的不同而变化。

//There are four function types, varying based on parameters and return types.

// 1-With Parameters and No Return Value:
val myVariable: (Int, String) -> Unit = { a: Int, b: String -> println("$a + $b") }

// 2-With Parameters and Return Value:
val myVariable2: (Int, String) -> String = { a: Int, b: String -> "$a + $b" }

// 3-No Parameters and No Return Value:
val myVariable3: () -> Unit = { println("No Parameters and No Return Value") }

// 4-No Parameters and Return Value:
val myVariable4: () -> String = { "Return String" }

并不总是需要变量,因为lambda表达式可以直接使用。

// A variable isn't always necessary, as lambda expressions can be used directly.
println( {a: String, b: String -> "$a $b"} ("jacky", "josn") )

匿名函数

在 Kotlin 中,匿名函数和 lambda 表达式都是未命名的函数,可以作为值传递。不过,匿名函数使用 ‘fun’ 关键字定义,而 lambda 表达式则使用花括号 {}

//Syntax of Anonymous Function
val myVariableName: (FirstDataType,SecondDataType) -> ReturnType =
            fun(firstParameter,secondParameter): ReturnType { MethodBody }

//Example of Anonymous Function:
val myVariable: (String, String) -> String = fun(a, b): String {
    return "$a $b"
}

此外,在创建匿名函数时,我们可以使用更短的语法

// Shorter Syntax Of Anonymous Function
val myVariableName = fun(FirstDataType,SecondDataType) : ReturnType { MethodBody }

// Shorter Syntax Of Anonymous Function:
val myVariable = fun(a:String,b:String): String { return "$a + $b" }

// When the method body contains just one statement,
// the return keyword and braces can be omitted.
val myVariable2 = fun(a:String,b:String): String = "$a + $b"

最后,让我们探索基于参数和返回类型的各种匿名函数格式。

// Let's explore various anonymous function formats, 
// depending on the parameters and return type.

// 1- With Parameters and No Return Value:
val myVariable = fun(a: String, b: String): Unit {
    println("$a $b")
}

// 2- With Parameters and Return Value:
val myVariable2 = fun(a: String, b: String): String {
    return "$a $b"
}

// 3- No Parameters and No Return Value:
val myVariable3 = fun(): Unit {
    println("No Parameters and No Return Value:")
}

// 4- No Parameters and Return Value:
val myVariable4 = fun(): String {
    return "Hi!"
}

fun main() {
    myVariable("Hüseyin","Özkoç")
    println(myVariable2("Orkun","Ozan"))
    myVariable3()
    println(myVariable4())
}

上述代码运行结果

结论

因此,在 Kotlin 中,函数被称为“一等公民”,这意味着它们可以被分配给变量,作为参数传递给其他函数,或作为函数的返回值。在 Kotlin 中,有两种方法将函数分配给变量,其中一种是通过 lambda 表达式来实现,lambda 表达式是括在大括号内的简洁的匿名函数。匿名函数和 lambda 表达式都是未命名的函数,可以作为值进行传递,不过,匿名函数使用“fun”关键字来定义,而 lambda 表达式则是用花括号 {} 来定义。总的来说,Kotlin 中的这些特性提供了更加灵活和简洁的编码方式。

参考

https://kotlinlang.org/
https://semicolonspace.com/kotlin-lambda-function-literals/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/637349.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

去中心化公链生态是否还有未来

2020年流动性挖矿带来的高收益让 DeFi Summer 点燃了2021年的大牛市。质押借贷、AMM作市、DEX、GameFi以及元宇宙等赛道的相继爆火,让整个行业看到了区块链的未来潜力,公链生态的繁荣也给项目带来了更多的可能性。而当市场进入熊市时,不少公链…

【netty基础】Java NIO三件套

文章目录 一. 缓冲区1.Buffer操作基本API2.Buffer的基本原理2.1. put操作2.2. get操作2.3. clear()回到初始化buffer的值 3.缓冲区的分配4.缓冲区分片5.只读缓冲区6. 直接(direct)缓冲区7. 内存映射 二. 选择器三. 通道…

直接插入排序--C语言(附详细代码)(附图详解)

目录 插入排序法的介绍 什么是插入排序法? 稳定性分析 插入排序基本思想 例子分析 实现代码 运行结果 插入排序法的介绍 什么是插入排序法? 插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。…

Django-3.2-LTS兼容哪些Python版本?支不支持Python3.9.10?

问:请问Python的3.9.10版本兼不兼容Django的3.2版? 答:Python 3.9.10 和 Django 3.2 之间是兼容的。Django 3.2 是一个长期支持(LTS)版本,它支持 Python 3.6、3.7、3.8 和 3.9。因此,Python 3.9…

母线差动保护(二)

3、大差和小差 接入大差元件的电流为I母、II母所有支路(母联除外)的电流,目的是为了判断故障是否为母线区内故障;接入小差元件的电流为接入该段母线的所有支路的电流,目的是为了判断故障具体发生在哪一条母线上。 以双…

ifconfig: RX packets 一直为 0

本博客的很多内容都是经验之谈,目的是给遇到类似问题的小伙伴提供一个解决问题的思路,如果试了不行,可以快速跳过,再寻找其他的解决方案。 如题目所言,今天遇到的问题是和网络连通性相关的,就是网络不通&a…

为什么企业推行OEE总是坚持不下去?

OEE很难推行吗? 企业追求高效率和减少浪费变得尤为重要,而在这个过程中,OEE(Overall Equipment Efficiency)成为了一个非常有用的工具,它可以为企业提供准确的数据,了解生产过程中存在的浪费程…

AttributeError: module ‘numpy‘ has no attribute ‘typeDict‘

问题描述&#xff1a;运行一个网上下载的PyQt5代码&#xff0c;出现了AttributeError: module numpy has no attribute typeDict的错误。具体如下&#xff1a; Traceback (most recent call last):File "F:/PyQt5/Javacr/main.py", line 16, in <module>from …

面向对象的介绍和内存

学习面向对象内容的三条主线 • Java 类及类的成员&#xff1a;&#xff08;重点&#xff09;属性、方法、构造器&#xff1b;&#xff08;熟悉&#xff09;代码块、内部类 • 面向对象的特征&#xff1a;封装、继承、多态、&#xff08;抽象&#xff09; • 其他关键字的使用…

3 个技巧,让你像技术专家一样解决编码问题

「我应该如何提高解决问题的能力&#xff1f;尽管我掌握了 JavaScript&#xff0c;却无法解决实际问题或理解复杂的 JavaScript 代码。」 经常有年轻的开发者朋友问我类似的问题。对开发者来说&#xff0c;解决问题非常重要。编写优秀的代码是一门创造性的艺术&#xff0c;而要…

Linux第二章之基本指令

目录 第一章、基本指令 01. ls 指令 02. pwd命令 03. cd 指令 04. touch指令 05.mkdir指令&#xff08;重要&#xff09; 06.rmdir指令 && rm 指令&#xff08;重要&#xff09; 07.man指令&#xff08;重要&#xff09; 08.cp指令&#xff08;重要&#xff0…

【性能测试系列】JMeter核心技术:分布式压测和参数化

JMeter分布式压测 为什么要做分布式部署? 在上一篇文章中&#xff0c;我们提到了JMeter的线程启动和运行&#xff0c;是会占用系统资源的&#xff0c;一旦需要大并发&#xff0c;而JMeter单机部署配置不够&#xff0c;将会导致JMeter无法在规定时间内启动对应的线程数&#x…

OpenCV项目开发实战--对图像进行非真实感渲染-附Python、C++的代码实现

编写一个过滤器来创建如上所示的风格化/卡通化图像,OpenCV 3 中边缘保留过滤的非常快速的实现。结果与双边过滤非常相似,但速度更快。 用于边缘感知过滤的域变换 它是Eduardo Gastal 和 Manuel Oliveira 在SIGGRAPH 2011 上题为“边缘感知图像和视频处理的域变换”的论文的部…

MM ME21n/Me22n 采购订单创建保存后增强点

有2处可以增强 我们可以在 013 这里 做这个增强 debug可以看到参数 传递到外部系统中 另外一处是

【VMware】VMware17安装实践记录

目录 1、下载地址 2、安装 2.1 更改一下安装路径 3、激活 前言&#xff1a;本博文记录博主自己安装的过程&#xff0c;便于后续自己学习使用 1、下载地址 联系博主 2、安装 2.1 更改一下安装路径 移除更新和加入计划 3、激活 可使用30天版本

ABeam中国2023社招 | ABeam旗下艾宾信息技术开发(上海)热招职位

招聘岗位 SAP SD Consultant (English Speaker) 职位要求 ■ 3年以上SD项目实施或支持经验 ■ 有效的沟通技巧&#xff0c;快速的反应和积极的态度 ■ 能够在压力下工作或面对挑战 ■ 具备ABAP调试和编程能力 ■ 有MM交叉模块知识优先 ■ 良好的英语能力 SAP EWM/MM Co…

易基因:NAR:ChIP-seq等揭示蛋白质酰基化与c-di-GMP协同调控放线菌发育与抗生素合成机制|项目文章

易基因细菌ChIP-seq测序分析结果见刊《Nucleic Acids Research》 大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 2023年06月07日&#xff0c;华东理工大学生物工程学院和生物反应器工程国家重点实验室叶邦策教授和尤迪副教授为共同通…

Redis命令-List、Set和SortedSet类型

1. List类型 与Java中LinkedList类似&#xff0c;可以看做是一个双向链表结构&#xff0c;既支持正向检索也可以支持反向检索。 关于BLPOP和BRPOP&#xff0c;需要设置阻塞时间 此时在另一个客户端中&#xff0c;在user2中添加一个元素 则在第一个客户端中&#xff0c;阻塞解除…

【图神经网络】用PyG实现图机器学习的可解释性

Graph Machine Learning Explainability with PyG 框架总览示例&#xff1a;解释器The Explanation ClassThe Explainer Class and Explanation SettingsExplanation评估基准数据集Explainability Visualisation实现自己的ExplainerAlgorithm对于异质图的扩展解释链路预测 总结…

如何在Windows 10中创建提升的命令提示符快捷方式

命令提示符是在“命令提示符”窗口中键入计算机命令的入口点。通过在提升的命令提示符中键入命令,你可以在不使用 Windows 图形界面的情况下在计算机上执行需要管理员权限的任务。 一、右键单击或按住桌面上的空白区域,然后单击“新建”和“快捷方式”。 二、将下面的任一…