Kotlin学习-函数的定义和调用(2)

Kotlin基础——函数定义及调用 扩展函数看起来像是String的成员函数,但是实际上并不是,他只是一个将String作为第一个参数传入的函数,是归属于StringFunctions类的,所以假设想要继承String,并重写lastChar方法,这并不是重写,而只是在子类中定义了一个lastChar方法而已。Kotlin中可变参数可以这样添加,而Java中不可以,因为Java中传入的数组是一个整体,传入数组就不能加其他参数了,而Kotlin中因为将数据进行了展开,所以还可以传其他参数。中缀调用可以用于任何只有一个参数的函数,包括扩展函数。 阅读详情


上篇我们学习了 Kotlin 学习-基础语法(1)
现在来看下 kotlin的函数定义和调用又怎样的区别。

1. 函数默认参数值

在Java中普遍存在的一个问题就是,一些类的重载函数太多,尤其是参数多的时候。
而在kotlin中可以在声明函数的时候指定默认参数值,这样可以避免创建重载的函数。
如下面的例子:

fun getString(a: String, b: String = "", c: String = ""): String {
    val result = StringBuilder()
    result.append(a)
    result.append(b)
    result.append(c)
    return result.toString()
}
println("${getString("Tom")}")
println("${getString("Tom", "Jay")}")
println("${getString("Tom", "Jay", "Curry")}")

>System.out: Tom
>System.out: TomJay
>System.out: TomJayCurry

从上面的例子可以看出参数的默认值是在被调用的地方,而不是调用的地方。

2. 顶层函数和属性
2.1 顶层函数

在java中我们少不了要写各种各样的工具类,而在kotlin中不需要创建这些类。把这些函数直接放到代码文件的顶层,不用属于任何类。
例如,我们创建一个名为 test.kt的文件,其中代码如下:

package com.yao.kotlinsimple

fun testTopMethod() {
    println("this is testTopMethod")
}
// 在其他类中直接调用
testTopMethod()
>System.out: this is testTopMethod

由上面的顶层函数可看出,它的作用类似于java类的静态方法。与下面的java代码作用一样。

public class TestKt {
	public static void testTopMethod() {
		....
	}
}
// 在其它类中调用
TestKt.testTopMethod()
2.2 顶层属性

和函数一样,属性也可以放到文件的顶层。顶层属性与其他任意属性一样,是通过访问器来使用的(如果是val 就只有一个getter,如果是var 就对应一对 getter和setter)。

// 与其他属性一样
var count = 0 
// 只能获取不能改变值
val name = "Tom"
// 等同于Java的 public static final String API_URL= "http://xxx.com"
const val API_URL= "http://xxx.com"
3. 扩展函数和属性
3.1 扩展函数

扩展函数就是一个定义在类外面的成员函数。比如我们添加一个方法,来获取一个字符串的最后一个字符:

// 获取字符串的最后一个字符
fun String.lastChar(): Char = this.get(this.length - 1)

println("${"i am Tom".lastChar()}")
>System.out: m

上面的扩展函数中String是接收者类型,方法体中的this是接收者对象。
从某种意义上讲,你已经为String类添加了一个自己的方法。

3.2 扩展属性

kotlin还支持扩展属性,我们把上面的函数转成属性来试下:

// 定义扩展属性,并设置setter和getter方法
var StringBuilder.lastChar: Char
get() = get(length - 1)
set(value) = this.setCharAt(length - 1, value)

>>>println("i am a person?".lastChar())
>?
>>>val ab = StringBuilder("kotlin?")
>>>ab.lastChar = '!'
>>>println(ab)
>kotlin!

可以看到,扩展属性也和接收者的普通成员属性一样。
这里必须定义getter函数,因为没有支持字段,没有默认getter的实现。

4. 局部函数

首先我们来看下面一段常见的代码:

fun requestLogin(account: String, pwd: String) {
    if (account.isEmpty()) {
        throw IllegalArgumentException("empty account")
    }
    if (pwd.isEmpty()) {
        throw IllegalArgumentException("empty pwd")
    }
    login()
}

上面的代码经常会遇到,而且参数多的时候会出现大量的判断,代码抽取后不在一块的话也会非常难理解。
而kotlin的局部函数是怎样实现的呢?来看下。

fun requestLogin(account: String, pwd: String) {
    fun validate(value: String, fieldName: String) {
        if (value.isEmpty()) {
            throw IllegalArgumentException("empty $fieldName")
        }
    }
    validate(account, "account")
    validate(pwd, "pwd")
    login()
}

上面这样看起来就好多了,即避免了重复代码,又保证了代码的阅读性。
并且局部函数可以访问外层函数的参数,可以更加的简洁方便。

以上就是kotlin函数相关的学习,有什么不足的地方,在以后的学习中自勉吧。。。搬砖去

Kotlin静态方法定义和调用 在习惯java的开发之后,使用kotlin进行编码,总有那么些不自然。 静态类的定义: 全局静态(实际上说单例模型) 直接将类声明为object,那么所有的函数也就静态的了,这种一般适用于各种util的类。 object UIUtil { fun toast(context:Context,msg:String){ Toast.makeText(context,msg,Toast.LENGTH_SHORT).show(); } } 在kotlin代码中调用: UIUtil.t 阅读详情

相关推荐

DDR内存设计必看:DFI接口协议详解与实战避坑指南(附时序图解析)

本文深入解析了DDR内存设计中连接内存控制器与物理层的DFI接口协议,聚焦于DDR4/DDR5设计的实际痛点。文章详细阐述了协议版本兼容性、时钟架构(匹配频率与频率比系统)、PCB信号完整性设计以及上电初始化与调试等关键环节,为硬件工程师提供了一套从理论到实战的完整避坑指南,并附有时序图解析以助理解。

weixin_29256771的博客 330

【Kotlin学习】函数的定义与调用——顶层函数、扩展函数、中缀调用、局部函数等

学习于《Kotlin实战》,本文讲解了顶层函数、扩展函数、中缀调用、局部函数的概念和运用,讲解了在Kotlin中对字符串的处理

PanicLin的博客 2759

单端反激电源的RCD钳位电路吸收设计

反激电源尖峰电压和特点: 反激开关电源主要适用于中小功率<100W的电源设计中,特点是电路简单、成本低、可靠性高、宽稳压范围、转换效率PF高。但是由于本身变压器的漏感和其他参数的影响,变压器在高速开关关断瞬间会产生很大的尖峰电压,截止时产生的尖峰电压是由电路中的储能元件释放的电流引起的突变,过高的尖峰电压会影响开关管的正常工作,需要对尖峰电压采取措施抑制尖峰电压。 如上图所示,尖峰电压的钳位抑制方式有很多种。 TVS成本偏高,属于硬件导通,元件的可靠性较差,在低电压工作效果不理想。 RCD回路吸收

qq_31687191的博客 8488

Kotlin的常用顶层函数总结

kotlin和Java不一样,可以定义一些顶层函数,一些顶层函数用来可以简化一些操作,让你的代码变得更加简洁易懂,说白了也就是能装逼,这里总结一下平时用的多的。主要是4个,with,run,apply,let,also,use。with首先看with的定义@kotlin.internal.InlineOnly public inline fun <T, R> with(receiver: T, bl

JabamiYu的博客 5271

基于Halium 9为小米平板4移植Ubuntu Touch:内核适配与驱动调试实战

在移动设备生态中,Linux内核作为核心,通过硬件抽象层(HAL)管理底层硬件驱动,为上层系统提供统一接口。其模块化设计允许深度定制,是实现跨平台移植的技术基础。Halium项目正是利用这一原理,构建了一个中间层,将安卓内核的硬件支持能力“翻译”成标准Linux发行版能识别的格式,从而在手机、平板等移动设备上运行Ubuntu Touch、postmarketOS等移动Linux系统,极大地拓展了老旧设备的再利用价值。这一技术为开发者提供了在常见安卓硬件上进行Linux系统开发与定制的可能,尤其在嵌入式与物联

weixin_42639246的博客 371

KEIL5编译报错L6200E:__stdout重定义问题分析与解决

本文深入分析KEIL5编译报错L6200E中__stdout重定义问题的根源,指出因未完整定义__stderr导致与标准库stdio_streams.o冲突。提供完整重定义标准流、启用MicroLIB库等解决方案,帮助开发者彻底解决Symbol multiply defined错误,提升嵌入式开发效率。

uran的专栏 954

浅谈Kotlin语法篇之顶层函数、中缀调用、解构声明(四)

简述: 今天带来的是Kotlin浅谈系列的第四弹,这次主要聊下Kotlin独有的新特性,Java不具备的。Kotlin是一种增加许多新功能的语言,允许编写更简洁易读的代码,这使得我们的代码更易于维护。例如使用顶层函数和属性从此消除Java中的static、中缀表达式调用和解构声明等。 1、为什么要用顶层函数替代Java中的static函数 2、顶层函数和属性的基本使用 3、顶层函数实质原理 4、...

weixin_34174322的博客 416

AI OS与LLM as OS:人工智能操作系统的崛起

近年来,随着大语言模型(Large Language Model, LLM)技术的突飞猛进,人工智能领域掀起了新的革命浪潮。以ChatGPT、GPT-4等为代表的LLM模型展现出了惊人的自然语言理解和生成能力,使得人机交互前所未有地拟人化、情境化。在此背景下,业界开始探索将LLM作为操作系统(Operating System, OS)的可能性,由此催生出"AI OS"和"LLM as OS"的概念。本文将深入解读这两个前沿概念,分析其内涵、技术原理、应用前景及面临的挑战。

AI天才研究院 993

Kotlin基础学习(十二)—— 顶层函数和属性

Kotlin入门学习

123 798

通用抓取————6D位姿估计

这意味着算法在没有物体的先验知识(如 CAD 模型)的情况下,依然能够通过神经网络捕捉物体的外观、形状和几何特征,生成相关的 6D 位姿估计。通过输入物体类别的描述,算法能够推断出该类别物体的位姿和尺度,无需特定物体的 CAD 模型。在这个坐标空间中,物体的位姿和尺度都是已知的,基于这个标准化表示,算法可以对输入图像中的物体进行 6D 位姿和尺寸的估计。○优势: ICP 是一种非常有效的位姿优化算法,特别适合精细调整物体的位姿,确保最终估计的位姿与真实物体的点云或模型高度一致。

具身机器人和通用AI 2379

别再写XPath改DOM了!用OpenClaw零代码搞定爬虫全流程(抓取+清洗+存储)

免费版的大模型调用次数有限制(每天100次),但企业版是无限的,还能私有化部署;大模型分析DOM结构有时候会慢1-2秒,但比起节省的时间,完全可以接受;自定义Skill的文档还不够完善,但社区很活跃,有问题在Discord里问,很快就能得到回复。但总的来说,OpenClaw真的改变了我写爬虫的方式——以前我是“代码的奴隶”,现在我是“需求的提出者”,把时间花在更有价值的业务逻辑上,而不是重复繁琐的DOM调试上。如果你也在被传统爬虫折磨,强烈建议你试试OpenClaw,相信我,用了就回不去了。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1313

Kotlin系列篇--Kotlin函数定义和调用

第三部分:Kotlin函数的定义和调用 前言:为了让介绍更简单直白,我将把Kotlin集合、字符串和正则表达式作为重点问题领域 目录 第三部分:Kotlin函数的定义和调用 一、Kotlin中集合的创建: 二、顶层函数和属性: 三、扩展函数和属性: 四、可变参数、中缀调用: 五、正则表达式: 六、局部函数: 总结: 一、Kotlin中集合的创建: 在kotli.collections包中包含List(有序集合)、Set(无序集合)、Map(健值对)三种集合: Collect..

居家小男的博客 1638

离散小波变换(概念与应用)

离散小波变换(概念与应用)

weixin_46713695的博客 4415

kotlin中函数的定义和调用

1 、函数声明(前面内容官方有) Kotlin 中的函数使用 fun 关键字声明 fun double(x: Int): Int { return 2 * x } 函数参数使用 Pascal 表示法定义,即 name: type。参数用逗号隔开。每个参数必须有显式类型: fun powerOf(number: Int, exponent: Int) { …… } 函数参数可以有默认值,...

lin_henry的博客 3454

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

WINCC7.3破解文件

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

Kotlin学习之路(3)——函数的定义与调用

函数的定义与调用 让函数更好调用 命名参数 使用Java这种面向对象函数,我们肯定会经常遇到函数调用,例如: joinToString(list, "; ", "[", "]") 当我们第一次调用这种函数时就很懵,不知道每一个参数的含义,就造成了不必要的麻烦。 当调用一个Kotlin定义的函数时,可以显示的表明参数的名称。 如果在调用一个函数时你指明了某一个参数的名称,那么为了避免混淆,你需要指明所有i的参数名称,例如: joinToString(list, separator = "; ", prefi

AthonyDavis的博客 1957

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

《kotlin实战》学习总结(2)函数的定义与调用

《kotlin实战》学习总结(2)函数的定义和调用1在kotlin中创建集合2 让函数更好调用2.1 命名参数2.2 默认参数值2.3 消除静态工具类:顶层函数和属性顶层函数顶层属性3 给别人的类添加方法:扩展函数和属性3.1 导入和扩展函数3.2 从java中调用扩展函数3.3 不可重写的扩展函数3.4 扩展属性4 让你的代码更简洁:局部函数和扩展4.1提取逻辑到扩展函数 函数的定义和调用 1在kotlin中创建集合 val set = hashSetOf(1, 7, 53) val list = arr

weixin_42980441的博客 541

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

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

《Kotlin实战》-第03章:函数的定义与调用

《Kotlin实战》-第03章:函数的定义与调用

crazyf2015的博客 1108

【Kotlin】Kotlin 与 Java 互操作 ① ( 变量可空性 | Kotlin 类型映射 | Kotlin 访问私有属性 | Java 调用 Kotlin 函数 )

一、Kotlin 变量可空性 1、Java 与 Kotlin 空值处理区别 2、Java 函数返回非空值和控制 3、Kotlin 函数调用 Java 函数 4、平台类型 5、@NotNull 和 @Nullable 注解 二、Kotlin 的 Java 类型映射 三、Kotlin 访问 Java 私有属性 四、Java 调用 Kotlin 函数 1、函数调用 2、分析 Kotlin 代码生成的字节码数据 3、使用 @JvmName 注解修改 Kotlin 生成的 Java 类名

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

Kotlin 语言学习(2) - 函数的定义与调用

一、本文概要 二、在 kotlin 中创建集合 在kotlin中,创建HashSet、ArrayList和HashMap的方法如下: 通过打印这些集合的类型,可以看到是采用的标准的Java集合类: 这么做的原因,是因为使用标准的Java集合使kotlin可以更容易地与Java代码交互。当从Kotlin调用Java函数的时候,不用转换它的集合类来匹配Java的类,反之亦然。 在...

蒙的博客 620

Kotlin学习总结:函数的定义与调用(一)

Kotlin学习总结:函数的定义与调用(一) 主要包括: 用于处理集合、字符串和正则表达式的函数 使用命名参数、默认参数,以及中缀调用的语法 通过扩展函数和属性来适配Java库 使用顶层函数、局部数和属性架构代码 将看到Kotlin改进每个程序的一个重要环节:函数的声明和调用。还将研究如何通过扩展函数将Java库转换为Kotlin风格,以在混合语言的项目中获得Kotlin的全部好处。 ##在...

qq_40277846的博客 627

Kotlin学习总结:函数的定义与调用(二)

Kotlin学习总结:函数的定义与调用(二) 给别人的类添加方法:扩展函数和属性 Kotlin的一大特色,就是可以平滑地与现有代码集成。甚至,纯Kotlin的项目都可以基于Java库构建,如JDK、Android框架,以及其他的第三方框架。当在一个现有的Java项目中集成Kotlin的时候,依然需要面临现有代码目前不能转成Kotlin,甚至将来也不会转成Kotlin的局面。可以使用扩展函数来实现使...

qq_40277846的博客 693

Kotlin(五)、函数定义与调用

一、为了更方便调用 一个函数定义如下: /** * 实现输入一个集合,如1,2,3 通过这个方法打印出 (1;2;3) */ fun <T> joinToString(collection: Collection<T>,//输入集合 separator: String,//分隔符 ...

齐天的博客 531

Kotlin学习总结:函数的定义与调用(三)

Kotlin学习总结:函数的定义与调用(三) 处理集合:可变参数、中缀调用和库的支持 可变参数的关键字vararg,可以用来声明一个函数将可能有任意数量的参数 一个中缀表示法,当你在调用一些只有一个参数的函数时,使用它会让代码更简练 解构声明,用来把一个单独的组合值展开到多个变量中 扩展Java集合的API 本部分的前提,是基于Kotlin中的集合与Java的类相同,但对API做了扩展。可以看...

qq_40277846的博客 417

kotlin定义方法和调用

kotlin定义方法和调用

zhansan的博客 1471

Kotlin语言的函数定义

kotlin在这个示例中,我们定义了一个名为add的函数,它接收两个Int类型的参数a和b,并返回它们的和。

2501_91241404的博客 989

Kotlin 系列之函数的定义与调用

3 月,跳不动了?>>> 创建了一个 Kotlin ...

黑帽子技术的博客 414
上一篇: Android 10 触控条出现大白条的问题
下一篇: Java 泛型
coder_yao
博客等级 码龄10年 9粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值