Kotlin语言基础(三)- 函数

news2024/11/26 13:39:55

函数可以定义特定功能的代码块。

一、函数定义

Kotlin语言定义函数的基本形式:

fun 函数名(【参数:参数类型,参数:参数类型…】)【:返回值类型】{
//函数体
}

如果函数体只有一条返回值,也可以简化成如下形式:

fun 函数名(【参数:参数类型,参数:参数类型…】)【:返回值类型】=表达式

以上【】表示可选项,可以忽略。
例:定义一个执行加法的函数,可以定义:

fun add(x:Int,y:Int){
   return x+y
   }

fun add(x:Int,y:Int) = x+y

二、特殊函数

1.扩展函数

Kotlin通过扩展函数提供为已有的类的新的功能而无需继承该类或使用装饰者模式这样的设计模式。定义形式如下:

fun 类名.函数名([参数1,参数2,….]):返回类型{
//方法体
}

例,为String类增加一个新的函数display,定义如下:

fun String.display(){
    println(this)
}

则调用下列代码块:

"hello".display()

运行结果是:
hello

2.高阶函数

Kotlin中支持函数的参数(也可以表示为Lambda表达式)或者返回值为函数(Lambda表达式),具有这样形式的函数称为高阶函数
2.1 函数作为函数的参数
例:

fun operate(x:Double,y:Double,operator:(Double,Double)->Any):Any = operator(x,y)

在上述代码中定义了函数参数operator,并返回operator运算的结果作为函数的返回值。
调用上述函数:

val method = {x:Double,y:Double->
    x+y
}
val result = operate(20.0,30.0,method)

val result=operate(20.0,30.0,operator= { x:Double,y:Double->
     							x+y
							})

val result = operate(20.0,30.0) { x, y ->
                x + y
            }

2.2 函数作为函数的返回值

fun operate(expression:String):(Double,Double)->Any {
    val op = when{
        expression.contains("+")->::add
        expression.contains("-")->::sub
        expression.contains("x")->::mul
        expression.contains("/")->::div
        expression.contains("%")->::mod
        expression.contains(">")->::isBigger
        else->throw ArithmeticException("$expression 出现错误!")
    }
    return op
}

其中,add,sub,mul,div等均为已经定义的函数。类似如下形式

fun add(x:Double,y:Double) = x+y
fun sub(x:Double,y:Double) = x-y
fun mul(x:Double,y:Double) = x*y
fun div(x:Double,y:Double) = x/y
fun mod(x:Double,y:Double) = x%y
fun isBigger(x:Double,y:Double) = x>y

3.内联函数

内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展)。在Kotlin语言中当一个函数被内联 inline 标注后,在调用它的地方,会把这个函数方法体中的所有代码移动到调用的地方,而不是通过方法间压栈进栈的方式。在编译时期,把调用这个函数的地方用这个函数的方法体进行替换。

inline fun show(message:String){
    println(message)
}

fun main(){
    println("main测试内联函数")
    show("内联函数")
    println("测试结束")
}

在Android Studio中选择Tools/Kotlin/Show Kotlin Bytecodes,则显示结果如下所示:

在这里插入图片描述
单击Decompile按钮,显示反编译的代码
在这里插入图片描述Inline往往用在Lambda表达式上,可以带来性能上的提升。

inline fun operateArithmetic(op:String):(Double,Double)->Any{
    return when(op){
        "+"->::add
        "-"->::sub
        "x"->::mul
        "/"->::div
        "%"->::mod
        ">"->::isBigger
        else-> throw ArithmeticException("运算错误!")
    }
}

fun main(){
    println("main测试内联函数")
    val op = operateArithmetic("+")
    println(op(23.34,45.034))
    println("测试结束")
}

三.标准函数

1.let函数
let函数在对象的上下文中执行一个代码块,使得代码执行更加简洁
定义形式:

@InlineOnly
public inline fun <T, R> T.let(block: (T) -> R):R

例:

fun main(){
    val message:String? = "hello kotlin world"
    //let将当前对象message执行多次操作
   val c = message?.let {it:String->
        println(it.length)
        println(it.lines())
        "something"
    }
    println(message)
    println(c)
}

运行结果是:
18
[hello kotlin world]
hello kotlin world
something

在上述代码中,如果删除”something”则let函数调用没有返回值

2.with函数
with函数以给定的接收者作为接收者调用指定的函数块并返回其结果,是处理对某一个对象连续调用多次调用它的相关方法的处理。
定义的基本形式:

@InlineOnly
public inline fun <T, R> with(
receiver: T,
block: T.() -> R
): R

例:

fun main(){
  var message="hello kotlin world"
  val c=with(message){
      println(length)
      println(lines())
      "$this welcome to new world"
  }//返回最后一行的结果
  println(message)
  println(c)
}

运行结果是:
18
[hello kotlin world]
hello kotlin world
hello kotlin world welcome to new world

3.run函数
run函数使用this作为接受器来访问当前对象,执行对某个对象的多次不同的调用,并返回结果。它接受一个Lambda表达式作为参数。当前对象作为Lambda表达式的上下文。调用run函数,返回值为Lambda函数块最后一行,或者指定return表达式。用this访问函数块
定义的基本形式:

@InlineOnly
public inline fun <T, R> T.run(block: T.() -> R): R

例:

fun main(){
    var message = "hello kotlin world"
    val c =message.run{
        println(this.length)
        println(this.lines())
        "$this welcome to new world"
    }//返回最后一行的结果
    println(message)
    println(c)
}

4.apply函数
apply函数的主要作用是简化初始化对象的功能。apply函数接受一个Lambda表达式,Lambda表达式中的上下文就是这个对象本身。apply函数的返回值是对象本身。
定义的基本形式:

@InlineOnly
public inline fun T.apply(block: T.() -> Unit): T

例:

fun main(){
    var message:String? = "hello kotlin world"
    val c = message?.apply{
        println(length)
        lines()+" welcome "
    }//返回this对象
    println(c)
    println(message)
}

运行结果是:*
18
hello kotlin world
hello kotlin world
*

5.also函数
also函数适用于let函数的任何场景,一般可用于多个扩展函数链式调用。also函数与let函数有些相似又有自己的特点:一方面also函数将当前对象作为Lambda表达式的上下文;另外一方面,also函数的返回值是就是传入的当前对象。
定义的基本形式:

@InlineOnly
@SinceKotlin
public inline fun T.also(block: (T) -> Unit): T

例:

fun main(){
    var message:String? = "hello kotlin world"
    val c = message?.also{
        println(it.length)
        it.lines()+" welcome "
    }//返回this对象
    println(c)
    println(message)
}

运行结果是:
18
hello kotlin world
hello kotlin world

参考文献

陈轶《Android移动应用开发(微课版)》 清华大学出版社 ISBN 978-7-302-59734-6

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

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

相关文章

springboot实现ACL+RBAC权限体系

本文基于web系统的权限控制非常重要的前提下&#xff0c;从ALC和RBAC权限控制两个方面&#xff0c;介绍如何在springboot项目中实现一个完整的权限体系。 源码下载 &#xff1a;https://gitee.com/skyblue0678/springboot-demo 序章 一个后台管理系统&#xff0c;基本都有一套…

更好用的Mybatis Plus:Mybatis Flex(下)

前言 上篇文章讲了 Mybaits Flex 的基础用法&#xff0c;这次讲一下 Mybatis Flex 的进阶用法&#xff0c;包含了一些 Mybatis Flex 核心的一些功能。&#xff08;以下简称 MF&#xff09; 逻辑删除 上篇文章讲到了 Column 注解&#xff0c;其中有个属性为 isLogicDelete &…

2023软工作业(一)——计算器

班级班级社区作业要求软件工程实践第一次作业-CSDN社区作业目标完成一个具有可视化界面的科学计算器参考文献Fyne 目录 作业要求 项目源码地址 作业目标 0. 界面及功能展示 1. PSP表格 2. 解题思路描述 3. 核心代码 4. 设计与实现过程 5. 程序性能改进 6. 单元测试展…

向华为学习:制订一份分工明确、能够落地的产品GTM行动计划表

昨天华研荟介绍了新产品上市的GTM的定义、GTM这个岗位&#xff08;角色&#xff09;的主要工作以及新产品的GTM要回答好的四个问题&#xff08;Why、What、How、Where&#xff09;&#xff0c;帮助大家初步理解了让产品上市更成功的GTM流程。 如我昨天在文章中所讲到的&#x…

ACM MM 2023 | 基于去中心化表征的人体姿态估计方法

01. 前言 北京邮电大学与EVOL创新团队共同提出人体姿态估计方法DecenterNet&#xff0c;用于在提高在拥挤场景下人体姿态估计的准确度。该方法引入了一种去中心化的姿势表征方法&#xff0c;使得网络在纠缠区域/拥挤区域中将更加稳健地表达人体姿态。该方法还提出了一个解耦的…

LeetCode【577. 员工奖金】

表&#xff1a;Employee ---------------------- | Column Name | Type | ---------------------- | empId | int | | name | varchar | | supervisor | int | | salary | int | ---------------------- empId 是该表中具有唯一值的列。 该…

BFS专题7 多终点迷宫问题

题目&#xff1a; 样例&#xff1a; 输入 3 3 0 0 0 1 0 0 0 1 0 输出 0 1 2 -1 2 3 -1 -1 4 思路&#xff1a; 单纯的 BFS 迷宫问题&#xff0c;只是标记一下每个点的 step&#xff0c;注意初始化答案数组都为 -1. 代码详解如下&#xff1a; #include <iostream> #…

Windows下使用pybind11教程(python调用C++代码)

1. 下载pybind11 gittub中下载&#xff0c;pybind下载后解压 2. C生成库文件 2.1.VS新建空白工程&#xff0c;工程名随意起 - 2.2更改目标文件名和配置类型 - 2.3更改目标文件拓展名 2.4添加include路径和库路径 包含目录中添加刚刚下载好的pybind的include路径以及pyhon的…

C#的HALCON引擎调用_传入参数输出结果实现流程

1、在Halcon的开发环境里面写处理流程。 此案例使用HALCON自带图片&#xff1a; read_image (Image, printer_chip/printer_chip_01) 读入图片之后&#xff0c;做处理流程&#xff1a; *图像处理流程&#xff1a; *传入图像变量&#xff0c;阈值最小值&#xff0c;最大值。…

软件测试/测试开发丨利用人工智能自动找Bug

点此获取更多相关资料 简介 在程序员编程的过程中&#xff0c;产生Bug是一件平常的事情&#xff0c;以前在编码的过程中提前找出Bug&#xff0c;需要通过单元测试、CodeReview等各种方式。 当今&#xff0c;人工智能技术的发展给软件开发和测试带来了许多机会。利用人工智能…

聊聊并发编程——多线程之AQS

目录 队列同步器&#xff08;AQS&#xff09; 独占锁示例 AQS之同步队列结构 解析AQS实现 队列同步器&#xff08;AQS&#xff09; 队列同步器AbstractQueuedSynchronizer&#xff08;以下简称同步器&#xff09;&#xff0c;是用来构建锁或者其他同步组 件的基础框架&…

TikTok美国市场爆品:美牙仪一周售出3.36万单,GMV近百万刀

最近一周&#xff0c;超店有数洞察到TikTok Shop美国市场出现一款爆火美牙仪&#xff0c;该款商品售价为31.95美金&#xff0c;佣金比率为25%&#xff0c;一周内销量达3.36万单&#xff0c;GMV近94万美金。自今年7月底上架以来在TikTok上关联视频播放量高达140W&#xff0c;属于…

企业长假期间如何应对突发业务需求?提前部署远程控制为上策

没有人想在长假期间加班&#xff0c;包括管理层也是一样的。但客观来说&#xff0c;很多企业的业务在假期中也是不能中断的&#xff0c;如果业务线遇到紧急需要处理的问题&#xff0c;有没有办法不用长途跋涉跑回公司一趟呢&#xff1f;远程控制现在就是很多企业的选择。 时值…

静态住宅代理是什么?为什么要选择它?

静态住宅代理是互联网服务提供商(ISP)分配的住宅ISP代理。正如名称“静态”所指&#xff0c;他的IP永久不会变化。在当今的数字时代&#xff0c;数据安全、隐私和在线访问已变得至关重要&#xff0c;具有无限带宽的静态住宅代理提供了出色的解决方案。下面给大家具体介绍。 一、…

Django实战项目-学习任务系统-需求说明

一&#xff0c;需求说明   在我最近的阅读中&#xff0c;我深深被一些关于智能或系统的小说吸引。这些小说的主角意外获得某种神秘的智能或系统&#xff0c;然后通过完成系统发布的各种任务&#xff0c;逐渐提升自己的知识和能力。即使是普通的屌丝&#xff0c;也能在系统的管…

win10环境mysql8.10免安装版本配置

MySQL :: Download MySQL Community Server 下载免安装包 解压到相应目录。 以管理员身份启动cmd net start mysql 服务无法启动。 运行mysqld --initialize --console初始化 生成临时密码 验证临时密码并登录测试 mysql -u root -p出错 启动 net start mysql 运行phpmya…

Leetcode684. 冗余连接

Every day a Leetcode 题目来源&#xff1a;684. 冗余连接 解法1&#xff1a;并查集 因为需要判断是否两个节点被重复连通&#xff0c;所以我们可以使用并查集来解决此类问题。 代码&#xff1a; /** lc appleetcode.cn id684 langcpp** [684] 冗余连接*/// lc codestart…

PID温度控制器,全球市场总体规模,前17大厂商排名及市场份额

PID温度控制器全球市场总体规模 PID温度控制器是一种常用的温度控制设备&#xff0c;能够通过使用比例、积分和微分控制算法来实现精确的温度调节。它可以监测和调整温度&#xff0c;保持设定的温度稳定。PID代表比例、积分和微分&#xff0c;比例&#xff08;P&#xff09;控…

【Verilog教程】6.7 Verilog流水线

关键词&#xff1a;流水线&#xff0c;乘法器 硬件描述语言的一个突出优点就是指令执行的并行性。多条语句能够在相同时钟周期内并行处理多个信号数据。 但是当数据串行输入时&#xff0c;指令执行的并行性并不能体现出其优势。而且很多时候有些计算并不能在一个或两个时钟周期…

linux权限机制,

目录 用户与组,id,passwd 查看登录用户whomi,who,w 创建用户 useradd 修改用户信息usermod 删除指定用户userdel 组 ​编辑创建修改删除组groupadd groupmod groupdel 权限 ls-l 修改文件所属用户&#xff0c;所属组 chown,chgrp(change group) 修改权限 chmod 默认权…