Kotlin学习历程——函数与Lambda表达式(一)

kotlin lambda之 “带接受者的lambda” lambda基础 lambda这一块是kotlin一大难点,作为初学者,本篇文章记录一下学习历程。主要讨论了labmda的基本语法,以及带有接受者的lambda这种特殊语法的含义。 基本语法 Lambda 表达式的完整语法形式如下: val sum: (Int, Int) -> Int = { x: Int, y: Int -> x + y } lambda 表达式总是括在花括号中, 完整语法形式的参数声明放在花括号内,并有可选的类型标注, 函数体跟在一个 -> 符号之后。如果推断出的该 阅读详情

Kotlin语言中文站

函数

基础写法

在Kotlin中使用关键字fun声明一个函数:

fun printInfo() {
    println("This is a function.")
}

如果携带参数呢?如下main函数所示:

fun main(args: Array<String>) {
    println("length:${args.size}")
}

如果一个函数没有返回值,如上两个函数,那么它的返回值类型默认是Unit,可省略不写:

我们看看Unit的源码:

package kotlin

/**
 * The type with only one value: the `Unit` object. This type corresponds to the `void` type in Java.
 */
public object Unit {
    override fun toString() = "kotlin.Unit"
}

看注释是说对应Java中的void,那就没必要纠结了。

如果有返回值呢,那就在函数后面写明返回值类型:

/**
 * 返回[0,range)范围的随机整数
 */
fun getRandomNumber(range : Int) : Int {
    return Random.nextInt(range)
}


/**
 * 一个简单的泛型函数
 */
fun <T> getBean(t: T) : T {
    return t
}

如果函数的函数体可以由单个表达式(表达式表示有返回值)计算出来,也可以简写成如下形式:

//单个表达式可以计算出来
fun sum(a: Int, b: Int) : Int{
    return a + b
}
//可以简写成如下形式, 它和上面的写法是等价的,不过更加简单明了
fun sum(a: Int, b: Int) : Int = a + b



//单个表达式可以计算出来
fun max(a:Int, b:Int) : Int {
    if(a > b) {
        return a
    }
    return b
}

//max
fun largeNumber(a:Int, b:Int) : Int = if(a > b) a else b

默认参数

Kotlin中函数可以有默认值,当省略相应的参数时就会使用默认值;相对Java而言,它可以减少一大堆重载函数。我们来看一个案例:

Android中EventBus库大家应该都不陌生,在很多业务场景下能实现代码逻辑解耦。如下是EventBus的一个消息事件类。

public final class IMessageEvent {
    /**
     * 此处是各种Message what
     * */
    
    public String msg_what;
    public String arg1;
    public String arg2;
    public int arg3;
    public int arg4;

    public BeBOMessageEvent(String msg_what) {
        this.msg_what = msg_what;
    }

    public BeBOMessageEvent(String msg_what, int arg3) {
        this.msg_what = msg_what;
        this.arg3 = arg3;
    }

    public BeBOMessageEvent(String msg_what, String arg1) {
        this.msg_what = msg_what;
        this.arg1 = arg1;
    }

    public BeBOMessageEvent(String msg_what, String arg1, int arg3) {
        this.msg_what = msg_what;
        this.arg1 = arg1;
        this.arg3 = arg3;
    }

    public BeBOMessageEvent(String msg_what, String arg1, String arg2, int arg3) {
        this.msg_what = msg_what;
        this.arg1 = arg1;
        this.arg2 = arg2;
        this.arg3 = arg3;
    }
}

可以发现重载的构造函数比较多。 如果用Kotlin来写,将会快捷很多:

class IMessageEvent(var msg_what: String, var arg1: String = "", var arg2: String = "", var arg3: Int = 0, var arg4: Int = 0) {
    companion object {
        val ENABLE_DEBUG_MODE = "ENABLE_DEBUG_MODE"
    }
}

使用如下:

//1个参数,其他全部用默认值
val messageEvent = IMessageEvent(IMessageEvent.ENABLE_DEBUG_MODE)
//2个参数,其他用默认值
val messageEvent1 = IMessageEvent(IMessageEvent.ENABLE_DEBUG_MODE, "A0001")
//或者这样(只传递首尾参数)
val messageEvent2 = IMessageEvent(IMessageEvent.ENABLE_DEBUG_MODE, "A0001", "", 0, 50)

默认参数在某些场景下(一个默认参数在一个无默认值的参数之前),使用上会产生歧义,导致编译报错:

fun printInfo(tag: String = "hepingdev##", info: String) {
    println("$tag$info")
}

调用如上函数:

看错误提示是因为没有传递参数值info,所以这就为难了(我是想第一个参数使用默认值,只传递第二个参数)。

具名参数

在kotlin中使用具名参数解决这类问题:

fun main(args: Array<String>) {
    printInfo(info = "函数")
}

也就是指明给哪个参数赋值,如上指明给info参数赋值。


可变数量的参数(vararg)

当方法的参数数据类型已经确定,但是参数的个数不确定,就可以使用可变数量的参数。 如下代码所示:

fun <T> mutableListOf(vararg elements: T): List<T> {
    val result = ArrayList<T>()
    for (t in elements) // elements is an Array
        result.add(t)
    return result
}

我们调用上面mutableListOf函数时,常见场景如:

  • 一个一个的传递参数
fun main(args: Array<String>) {
    //一个一个的传递参数
    var list = mutableListOf<String>("1", "2", "3")
}
  • 将一个数组的内容传递给该函数,使用展开操作符(在数组前面加*)
//传递一个数组的内容
var aList = arrayOf("1","2","3")
var concatList = mutableListOf("23234", *aList, "w3r")
println(concatList)  //打印:[23234, 1, 2, 3, w3r]

它类似JavaScript里面的展开操作符(…),只是写法不一样。


同样,如果vararg参数不是列表中最后一个参数,就需要使用具名参数传递其后的参数值。如下:

fun <T> subList(vararg elements: T, endIndex: Int): List<T>? {
    if(elements.isEmpty() || endIndex == 0) return null
    val result = ArrayList<T>()
    for (e in elements) {
        result.add(e)
        if(result.size - 1 >= endIndex) {
            break
        }
    }
    return result
}


//调用
fun main(args: Array<String>) {
    var aList = listOf<String>("1","2","3")
    //具名参数endIndex
    subList(aList, endIndex = 1)
}

中缀函数

如下代码中until即中缀函数,调用中缀函数不需要调用的点和圆括号。

for (i in 1 until 5){
    println("$i")  //1,2,3,4
}

声明一个中缀函数必须满足以下要求:

  • 必须是成员函数(对象的方法)或扩展函数。
  • 必须只有一个参数,且参数不得是可变数量的参数,同时不能有默认值。
  • 必须采用infix关键字修饰。

按照上面的要求,我们简单声明两个中缀函数看看,如下:

/*  对象的方法 */
class InfixFunction {
    infix fun printInfo(onlyParams : String) {
        println(onlyParams)
    }
}

/* 调用上面的中缀函数 */
fun main(args: Array<String>) {
    val mInfixFunction = InfixFunction()
    mInfixFunction printInfo "打印这个值"     //打印这个值
}




/* 扩展函数 */
infix fun Int.add_(b : Int) : Int = this + b

/* 调用上面的中缀函数 */
fun main(args: Array<String>) {
    val a = 1
    val c = a add_ 2
    println(c)  //3
}

很“高大尚”的一种语法糖,是不是很有意思呢😄。


上一篇:Kotlin学习历程——对象声明与伴生对象
下一篇:Kotlin学习历程——函数与Lambda表达式(二)

【数据分享】中国371个城市的坡度矢量数据和excel数据 在城市发展的进程中,地形地貌始终是影响规划决策的关键因素,而坡度作为表征地表倾斜程度的核心指标,更是贯穿于城市建设、生态保护等诸多环节。本文将全面解读中国 371 个城市坡度数据的相关情况,包括数据概况、生成流程、应用场景等内容,为读者呈现一份详尽的坡度数据指南。 阅读详情

相关推荐

计算机视觉:暗通道去雾算法的原理及python实现

在绝大多数非天空的局部区域中,某些像素总会至少有一个颜色通道的值很低。对于一幅图像J(x),其暗通道的数学定义表示如下:其中,Ω(x)表示以x为中心的局部区域,上标c表示RGB三个通道。该公式的意义用代码表达也很简单,首先求出每个像素RGB分量中的最小值,存入一副和原始图像大小相同的灰度图中,然后再对这幅灰度图进行最小值滤波,滤波的半径由窗口大小决定。

weixin_51998427的博客 1万+

kotlin的学习

懒得排版了。 需要查看的直接全局搜索即可。 类,抽象类,接口,继承,实现 类想要被继承,需要增加open修饰字符,abstract类型默认可以被继承,open修饰的类中不能存在抽象方法。 class MainActivity open class MainActivity abstract class BaseActivity interface OnClickListener class Mai...

不二的博客 329

本地服务器搭建Uptime Kuma网站监控服务

本文主要介绍如何在Linux系统中一键部署Uptime Kuma运维监控服务,并将这个服务映射至公网实现随时随地远程访问。如果您像我一样在服务器上托管了多个网站,并且没有足够的时间来手动检查每个网站的在线状态,那么当出现问题时,您可能无法及时收到通知来处理这些问题。因此,搭建一个在线监控服务是很有必要的,它可以在状态异常时提醒您,以便您能够及时处理问题,确保网站的稳定性和可用性。监控服务有很多,我最终选择了Uptime Kuma,因为Uptime Kuma是开源免费的,

Tiam_cr的博客 1823

【Kotlin】基础语法学习

Kotlin基础语法学习,以后android开发逐渐会使用Kotlin作为主流开发语言。

洪伟的专栏 1114

KMS服务器一键部署与激活实战指南

本文详细介绍了KMS服务器的一键部署与激活实战指南,包括快速入门、安装步骤、服务管理技巧及常见问题排查。特别针对Windows和Mac用户提供了Office激活的具体操作步骤,并分享了高级配置与优化方案,帮助IT管理员高效管理批量授权激活。

weixin_29305313的博客 461

【Excel VBA 编程】表格内自动生成进度条

在表格中生成进度条,进度条需要自适应单元格的宽度,根据不同进度区间变换颜色,并且按照进度数据大小显示其长短

wei1019的专栏 1519

《Kotlin 极简教程 》第4章 基本数据类型与类型系统

第4章 基本数据类型与类型系统 《Kotlin极简教程》正式上架: 点击这里 &gt; 去京东商城购买阅读 点击这里 &gt; 去天猫商城购买阅读 非常感谢您亲爱的读者,大家请多支持!!!有任何问题,欢迎随时与我交流~ 到目前为止,我们已经了解了Kotlin的基本符号以及基础语法。我们可以看出,使用Kotlin写的代码更简洁、可读性更好、更富有...

AI天才研究院 9031

C++/WinRT入门指南:现代Windows原生开发的核心技术

Windows运行时(WinRT)是微软为现代Windows应用开发设计的一套跨语言API框架,它基于COM技术原理构建,提供了统一的二进制接口标准。这项技术的核心价值在于让开发者能够以原生性能调用系统级功能,同时保持跨语言兼容性。在工程实践中,C++/WinRT作为官方推荐的C++语言投影,通过标准C++语法封装WinRT API,显著降低了开发复杂度。特别是在异步编程场景中,结合C++20协程特性,能够大幅提升代码可读性和维护性。对于需要高性能图形处理、系统集成或跨平台兼容的桌面应用开发,掌握C++/W

weixin_33910191的博客 1198

《Kotlin 程序设计》第六章 Kotlin 函数式编程(FP)

第六章 Kotlin 函数式编程(FP) 正式上架:《Kotlin极简教程》Official on shelves: Kotlin Programming minimalist tutorial 京东JD:https://item.jd.com/12181725.html 天猫Tmall:https://detail.tmall.com/item.ht...

AI天才研究院 8906

永磁同步电机无传感器控制:HFI与ESMO技术详解

高频注入(HFI)和增强型滑模观测器(ESMO)是现代永磁同步电机(PMSM)无传感器控制的核心技术。HFI通过注入高频信号利用电机凸极效应获取转子位置,而ESMO则通过改进传统滑模观测器,有效抑制抖振并提升动态响应。这两种技术的结合特别适用于零低速区域的位置估计,在工业伺服、电动汽车等领域有广泛应用。方波高频注入作为实现方案之一,具有计算量小、实现简单的特点,配合自适应滤波等信号处理技术,可以在保证精度的同时降低系统成本。

weixin_29183637的博客 355

【重磅更新】CT/MRI LI-RADS 2024:肝细胞癌局部区域治疗后反应评估的核心突破与临床实践指南

减少过度治疗:辐射 LRT 的 Nonprogressing 类别避免了 “持续强化 = 存活” 的误判,降低不必要的再治疗风险;提高检出效率:非辐射 LRT 的辅助特征升级减少了 Equivocal 比例,更早识别存活肿瘤;统一评估语言:标准化的分类标准为放射科、肝病科、肿瘤科、肝移植科的多学科协作(MDT)提供了统一 “沟通工具”,助力治疗方案的精准制定。

楚山之石的博客 1225

Kotlin函数式编程(一) Kotlin与函数式编程

一、什么是Kotlin?Kotlin是一门新兴的Jvm语言,与Scala等充满野心,想要取代Java的Jvm语言不同,Kotlin更像是Java的扩展,它能很好的和已有的Java代码一起工作,而比起Java,Kotlin提供了许多能够大幅提高开发效率的特性,使用Kotlin能写出比Java表现力更强,且更安全的代码。并且,Kotlin对函数式编程提供了比Java8更好的支持。 就在今年,Googl

Khellendros的博客 4102

SPV1050低功耗微功率太阳能充电管理模块原理图设计,已量产

在物联网应用快速普及的今天,户外低功耗传感器(如土壤温湿度、环境光照、无线节点等)的供电始终是行业痛点 —— 传统锂电池不仅需要定期更换,维护成本高,还难以满足 “终身免维护” 的场景需求。为此,我们设计了一款专为 1V~3V 低电压小型太阳能板优化的微功率太阳能电源管理模块,结合 USB 备用充电路径,实现了低功耗传感器的长期自主供电。

不脱发的程序猿 446

Kotlin学习历程——函数与Lambda表达式(二)

Kotlin语言中文站 高阶函数 以另一个函数作为参数或者返回值的函数叫高阶函数, 这个参数函数我们可以用lambda或者或者函数的引用来表示。 例如集合的filter就是一个高阶函数 fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> { //todo } 如上:(T) -> Boolean)是函数类型,因此filter是接受一个函数作为它的参数,所以符合高阶函数的要求。.

hepingdev的专栏 278

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Kotlin学习基础知识大全(上)

Kotlin是由JetBrains公司开发的一种静态类型编程语言,最初发布于2011年。JetBrains是知名IDE工具IntelliJ IDEA的开发商,他们开发Kotlin的目的是为了解决Java语言在开发效率、代码简洁性和安全性方面的一些不足。2016年2月,Kotlin 1.0正式发布,标志着语言进入稳定阶段。2017年5月,在Google I/O大会上,Google宣布Kotlin成为Android开发的官方支持语言,这一决定极大地推动了Kotlin的普及。Kotlin中使用fun。

百锦再的博客 1万+

android 蓝牙通讯demo

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

Kotlin之心路历程

Kotlin之心路历程 以小白眼光看kotlin kotlin这个小丫鬟被谷歌扶正为大房两年,期间看过不少博文,很多人也已经把个人项目迁移到kotlin了,当然国外的开发者更给力,直接大部企业开发已经kotlin,也订阅了涛哥的极客时间(一直没时间看,果然看视频太费事,还是文章可以抽得时间挤一挤学),一直是不想学习啊,一个人的惰性就是这样,java又不是不能用,代码通俗易懂。说句心里话,jav...

ApkCore的专栏 497

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Kotlin零基础入门到精通(精选)

Kotlin从入门到精通一. Kotlin课程概述1.1 课程安排:1.2 什么是Kotlin?1.3 Kotlin的发展历程1.4 学习目标1.5 必备知识1.6 参考资料1.7 Hello,world二. 数据类型2.1 本章目标2.2 Boolean类型2.3 Number类型2.4 Char类型2.5 类与对象2.6 空类型和智能类型转换2.7 包2.8 区间2.9 数组三. 程序结构3.1 常量与变量3.2 函数3.3 Lambda表达式 一. Kotlin课程概述 1.1 课程安排: 课程介绍

暗余的博客 2万+

lambda表达式杂谈

var personInfo = [ { name: "张三", age: 20, gender: "male" }, { name: "李四", age: 18, gender: "male" }, { name: "王五", age: 19, gender: "male" }, { name: "春香", age: 17, g...

diebianyi1454的博客 185

Kotlin学习(1):Kotlin简介

Kotlin简介、特点以及优势

Caesar的博客 510

Kotlin学习笔记

Kotlin从小白到入坑的历程从今天记录自己的学习历程:kotlin从今天记录自己的学习历程:kotlin 从今天记录自己的学习历程:kotlin 今天日期是2019.4.21日 这是我自从学习编程以来第一次写博客,虽然是属于个人闲来无趣的笔记,只是为了加深我对编程的认识.和对编程的理解 今天我从kotlin学习了数组,如果我对这些有误解还望大神指出来,以便我加以改进 数组的三个基本特性: 一...

小亮的博客 362

Kotlin 语言 知识点整理1【个人用】

Kotlin作为JetBrains开发的现代化语言,以其简洁、安全和高效特性成为Java的理想替代。它与Java完全互操作,共享JVM平台和生态系统,但通过空安全机制、扩展函数、数据类等特性大幅减少样板代码。核心优势包括:1)强制空安全设计杜绝NPE;2)支持函数式编程和Lambda表达式;3)协程简化异步编程;4)扩展函数增强代码组织。Java开发者应重点掌握空安全处理、集合操作、作用域函数及协程应用,通过IDE转换工具和Kotlin标准库快速上手。渐进式迁移策略和"以Kotlin方式思考&qu

indeedes的博客 261

Kotlin 初始之路1.0

一. 初识kotlin :基于java虚拟机的一门高级语言 Andrey和他的小伙伴写得一门语言 比Scala简单 ,依赖java的生态,具有java的静态语言特征,同时在语法上比java灵活很多,例如:在kotin中不需要写分号,支持方法的扩展,还支持Lambda表达式,支持函数式编程等 语法上还支持变量判空,比java友好很多 java中经常出现d的java.lang.NullPoin...

大白的博客 189

Android第二课-----Kotlin入门

2011年,JetBrains发布了Kotlin的第一个版本,并在2012年将其开源。2016年Kotlin发布了1.0正式版,代表着Kotlin语言已经足够成熟和稳定了,并且JetBrains也在自家的旗舰IDE开发工具IntelliJ IDEA中加入了Kotlin的支持。2017年Google宣布Kotlin正式成为Android开发一级语言,并且Android Studio也加入了对Kotlin的支持。2019年Google正式宣布了Kotlin First,未来提供的官方API也将会以Kotlin版

贝勒里恩的博客 2847

kotlin学习和常用知识

Kotlin 是一种由 JetBrains 公司开发的静态类型编程语言,旨在为 Java 开发者提供一种更加安全、简洁、易于使用的编程语言。Kotlin 可以编译成 Java 字节码,因此可以在 Java 虚拟机(JVM)上运行。下面是关于 Kotlin 的详细解释、发展历史、语法学习和代码解读。

AI时代光年 1506
上一篇: Kotlin学习历程——对象声明与伴生对象
下一篇: Kotlin学习历程——函数与Lambda表达式(二)
hepingdev
博客等级 码龄5年 3581粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hepingdev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值