学习Kotlin~函数

news2024/11/17 2:26:59

有名函数

在这里插入图片描述

函数参数

  • 不打算传入值参,可以预先给参数指定默认值
	//如果不打算传入值参,可以预先给参数指定默认值
	private fun fix(name: String, age: Int = 2) {
		println(name + age);
	}
	
	//调用的时候
	fix("hhhh");
	fix("hasee", 30);
  • 有名的函数值参,如果使用命名值参,可以不用管值参的顺序
   fix(age = 100, name = "华为")//如果使用命名值参,可以不用管参数的顺序

参数的顺序相反了,也不会影响最终结果。

Unit函数

Kotlin中没有返回值的函数叫Unit函数。

Nothing类型

  • TODO函数的任务就是抛出异常,就是永远别指望它能运行成功,返回Nothing类型
	val i = 30
	if (i > 3) {
	    println(i)
	} else {
	    TODO("argument is too small")
	}

反引号中函数名

  • kotlin中可以使用空格和特殊字符对函数命名,不过函数名要用一对反引号括起来
    fun `**iohguoippmnwjeeinwpeinwini1309-**`() {
        println("I am weird.")
    }

Android中不允许的

  • 为了支持Kotlin和Java互操作,而Kotlin和Java却又保留了各自关键字,不能作为函数名,使用反引号括住就能避免任何冲突
    比如:
	public class MyJava {
	    //is在Kotlin中是关键字
	    public static void is() {
	        System.out.println("MyJava");
	    }
	
	    public static void isConnect() {
	        System.out.println("MyJava isConnect");
	    }
	}

如果想在Kotlin中引用,那么要加上反引号

	MyJava.`is`();//is在kotlin中是关键字

匿名函数

  1. 不取名字的函数,我们称之为匿名函数;
  2. 匿名函数通常整体传递给其他函数,或者从其他函数返回;
  3. 匿名函数被称为lambda,kotlin中也称lambda为闭包;

参数

  • 匿名函数可以不带参数,可以带一个或多个参数
  • 带参数时,参数类型放在匿名函数的类型定义中,参数名放在函数体定义中
    /**
     * 匿名函数声明参数时候,需在括号内声明类型,变量名需写在函数体中
     */
    val blessingFunction1: (String) -> String = { name ->
        val holiday = "New Year"
        "$name, happy ${holiday}"
    }

it关键字参数

  • 定义只有一个参数的匿名函数时,可以使用it关键字来表示参数名。
  • 匿名函数有两个参数时候,it关键字不起作用了
    /**
     * 匿名函数声明只有一个参数的时候,可以不用在函数体中声明变量名,可以省略
     * 可以使用it关键字
     */
    val blessingFunction2: (String) -> String = {
        val holiday = "New Year"
        "$it, happy ${holiday}"
    }

匿名函数的类型推断

  • 如果已把匿名函数作为变量赋值给函数变量,就不需要显示指明变量类型
不带参数的类型推断

比如下面把一个函数变量赋给一个函数变量类型,这种写法的比较完整的。

    val blessingFunction: () -> String = {
        val holiday = "New Year"
        "happy $holiday"
        "happy ${holiday}"
    }

使用类型推断可以下面这样来写;不用显示指明匿名函数类型,就表示一个无参的返回值类型为String的函数变量。

    val blessingFunction = {
        val holiday = "New Year"
        "happy $holiday"
        "happy ${holiday}"
    }
带参数的类型推断
  • 匿名函数的参数名和 参数类型必须有
    val blessingFunction1: (String) -> String = { name: String ->
        val holiday = "New Year"
        "$name, happy ${holiday}"
    }

使用类型推断可以下面这样来写;不用显示指明匿名函数类型
就表示传入一个String类型参数,返回值类型为String的函数变量。

    val blessingFunction1 = { name: String ->
        val holiday = "New Year"
        "$name, happy ${holiday}"
    }

函数类型作为变量

  • 匿名函数可以当做变量赋值给函数类型变量,就像其他变量一样,匿名函数可以在代码里传递
  • 匿名函数会隐式或自动返回函数体最后一行语句的结果;
    /**
     * 声明一个函数类型变量
     * 函数类型是由参数和返回值决定的
     * ()->String : 无参数,返回类型String
     * 匿名函数默认最后一行是作为返回值,省略return
     */
    val blessingFunction: () -> String = {
        val holiday = "New Year"
        "happy $holiday"
        "happy ${holiday}"
    }

函数类型作为值参

传lambda【匿名函数】
  • 函数有参数,并且参数是函数类型变量
    /**
     * 类型推断
     */
    val discount2 = { name: String, hour: Int ->
        val currentYear = "2027"
        "${currentYear}年,双11${name}促销倒计时,还剩${hour}小时。"
    }

    showOnBoard("卫生纸", discount2);

    //具名函数
    fun showOnBoard(goodsName: String, showDiscount: (String, Int) -> String) {
        val hour = (1..24).shuffled().last();//乱序去最后一位
        println(showDiscount(goodsName, hour));
    }
  • 一个函数的lambda参数排在最后,或者是唯一的参数,那么括住lambda圆括号可以省略

上面的调用可以使用如下的写法;

    showOnBoard("卫生纸") { name: String, hour: Int ->
        val currentYear = "2027"
        "${currentYear}年,双11${name}促销倒计时,还剩${hour}小时。"
    }

    //具名函数
    fun showOnBoard(goodsName: String, showDiscount: (String, Int) -> String) {
        val hour = (1..24).shuffled().last();//乱序去最后一位
        println(showDiscount(goodsName, hour));
    }
传函数引用
  • 函数引用可以把一个具名函数转化成值参;使用::操作符,后跟具名函数
	/**
	 * 可以使用函数引用,使用::操作符,后跟要引用的函数名
	 */
	fun main() {
	    //
	    showA("家用电器", ::sh);
	}
	
	fun sh(name: String, age: Int): String {
	    val currentYear = "2027"
	    return "${currentYear}年,双11,${name}促销活动倒计时还剩${age}小时"
	}
	
	
	fun showA(goodsName: String, sh: (String, Int) -> String) {
	    val hour = (1..24).shuffled().last();
	    println(sh(goodsName, hour))
	}

函数类型作为返回值

	//定义一个函数返回类型
	fun showDetail(): (String) -> String {
	    val currentYear = "2027"
	    val hour = (1..24).shuffled().last()
	    //可以引用作用域之外的变量,kotlin中的lambda就是闭包
	    return { name: String ->
	        "${currentYear}年,双11,${name}促销活动倒计时还剩${hour}小时"
	    }
	}

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

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

相关文章

【Html】Html+Less实现一个简单的加载动画

效果 运行环境 系统&#xff1a;Win10系统 IDE&#xff1a;Visual Studio Code v1.79.2 VSCode插件&#xff1a;Easy LESS v2.0.0 index.html代码 <!DOCTYPE html> <html><head><title>加载动画</title><link rel"stylesheet" hr…

Android的Context详解 - 揭开Context的神秘面纱

这篇文章是基于我四年前的一篇文章进行更正和深入探究。背景是&#xff0c;2019年4月份我在找工作&#xff0c;看到一个问题&#xff0c;问this&#xff0c;getBaseContext()、getApplication()、getApplicationContext()的区别。当时我写了简单的demo验证&#xff0c;得出了跟…

看看螯合物前体多肽试剂DOTA-E[c(RGDfK)2]的全面解析吧!

【产品描述】 DOTA-E[c(RGDfK)2]螯合物前体多肽试剂&#xff0c;RGD肽指含有Arg-Gly-Asp三个氨基酸组成的序列多肽&#xff0c;可以提供大量的RGD直线肽&#xff0c;RGD环肽&#xff0c;RGD双环肽、RGD模拟肽等&#xff0c;也可以根据客户需求定制RGD肽。 DOTA-E [c (RGDfK) 2…

6.3 B树

多路平衡查找树 1.定义 B树的阶&#xff1a;B树中所有结点的孩子个数的最大值&#xff0c;表示成m m阶B树&#xff1a;空树或者满足如下特性的m叉树 特性&#xff1a; 1.树中每个结点最多子树 m 关键字m-1 2.根节点不是终端结点&#xff0c;至少有两棵子树 3.根结点除外&…

Java 遍历List的两种方式

可参考文章 Notepad编译并运行java代码_notepad怎么运行java代码_西晋的no1的博客-CSDN博客 中的第二种方法测试下述代码。 在java中&#xff0c;可以使用for循环和使用for-each循环两种方式遍历List。 1.使用for循环遍历List 2.使用for-each遍历List 注意&#xff1a;使用for-…

Java使用Maven工程操作OpenGL ES绘制三角形和圆形;绘制完成后操作键盘控制然图形移动

OpenGL ES 绘制三角形&#xff0c;操作键盘移动位置 PS&#xff1a;想快速看到效果的小伙伴&#xff0c;可以在引入依赖后&#xff0c;先跳到完整代码部分 第一步&#xff1a;依赖引入 <properties><lwjgl.version>3.2.3</lwjgl.version><joml.version&…

mysql 密码丢失的解决方案

问题描述 mysql 密码丢失的解决方案 解决方案&#xff1a; 停止服务; 重新启动服务&#xff1a;mysqld.exe --skip-grant-tables //启动服务器但是跳过权限; 当前启动的服务器没有权限概念&#xff1a;非常危险&#xff0c;任何客户端&#xff0c;不需要任何用户信息都可…

Pycharm连接远端Python环境操作Spark

文章目录 1. 创建工程&#xff0c;指定远端python解析器2. 添加远端python解析器3.配置完成4.本地文件自动同步远端5.删除远端python解析器(非必须操作&#xff0c;重新配置时参考该项)6. 文件模板配置 远程连接方案, 允许程序员连接远端测试环境, 确保环境的统一, 避免各种环境…

消息队列中间件(一)

场景 流量削峰 应用解耦 异步处理 分类 ActiveMQ 优&#xff1a;单机吞吐万级&#xff0c;时效性ms级&#xff0c;可用性高&#xff08;主从架构&#xff09;&#xff0c;可靠性高&#xff08;丢失率低&#xff09; 缺&#xff1a;官方维护少&#xff0c;高吞吐场景较少…

QT Creator上位机学习(二)基础控件及信号与槽

c# 系列文章目录 文章目录 布局控件信号与槽程序图标使用技巧 布局控件 美化界面的时候&#xff0c;经常需要进行一些控件的布局&#xff0c;这时需要使用一些容器类。 在快捷栏出&#xff0c;也有一些布局设计的选择 如上图&#xff0c;其中涉及到几种编辑状态&#xff1…

Math简单学习

1.绝对值 就变个符号 public static double abs(double a) {return (a < 0.0D) ? 0.0D - a : a; }public static float abs(float a) {return (a < 0.0F) ? 0.0F - a : a;}public static int abs(int a) {return (a < 0) ? -a : a;}IntrinsicCandidatepublic sta…

Redis【实战篇】---- 优惠卷秒杀

Redis【实战篇】---- 优惠卷秒杀 1. 全局唯一ID2. Redis实现全局唯一ID3. 添加优惠券4. 实现秒杀哦下单5. 库存超卖问题分析6. 乐观锁解决超卖问题7. 优惠券秒杀 ---- 一人一单8. 集群环境下的并发问题 1. 全局唯一ID 每个店铺都可以发布优惠券&#xff1a; 当用户抢购时&…

封装websocket请求-----vue2

参考 (875条消息) 封装websocket请求-----vue项目实战&#xff08;完整版&#xff09;_vue websocket封装_winne雪的博客-CSDN博客https://blog.csdn.net/m0_38134431/article/details/105794108 一、在utils目录下创建websocket.js文件 import {Message} from element-ui /…

Mac 已经在.bash_profie中配置过sdk环境依然报zsh: command not found: adb

提示 前置条件 已经安装好Android studio 然后~/.bash_profile 或.bash_profile也已经配置sdk路径&#xff0c;打开第二个终端输入adb时提示zsh: command not found: adb 解决办法 打开终端输入下面命令 echo export ANDROID_HOME/Users/$USER/Library/Android/sdk >>…

近日,我处理了一个大文件导入 nginx HTTP/1.1“ 413 585的问题

今天&#xff0c;导入一个1万多条数据的excel文件&#xff0c;本地没有用到nginx&#xff0c;导入很顺畅 部署到了线上后&#xff0c;导入文件后后台并没有日志输出&#xff0c;说明没有进入后端 经过摸排&#xff0c;分析&#xff0c;最终发现&#xff0c;是nginx这关没过 …

智能相机的功能介绍

智能视觉检测相机主要是应用在工业检测领域图像分析识别、视觉检测判断。相机具有颜色有无判别、颜色面积计算、轮廓查找定位、物体特征灰度匹配、颜色或灰度浓淡检测、物体计数、尺寸测量、条码二维码识别读取、尺寸测量、机械收引导定位、字符识别等功能。相机带有HDMI高清视…

stm32使用clion移植canfestival(canopen)

官方网站 https://canfestival.org/index.html.en 非官方的下载地址 GitHub - ljessendk/CanFestival 每个版本的源码会有些差异&#xff0c;移植代码的时候最好把源码也一并移植 以下使用硬石h743开发板, 并使用TIM8作为FDCAN1的定时器 STM32CubeMax 设置APB1的频率为20…

vscode设置可以搜索包含node_modules中的文件

步骤3中删除掉node_modules&#xff0c;再搜索的时候&#xff0c;node_modules的匹配到代码也会展示出来了。 如果不想要被搜索文件包含node_modules,再添加上就可以。

数值分析算法 MATLAB 实践 数值优化算法

数值分析算法 MATLAB 实践 数值优化算法 黄金分割法 function [x,y,k_cnt ] Goldensection(fun, a, b, eps) %fun为优化函数&#xff0c;a为区间左侧值&#xff0c;b为区间右侧值&#xff0c;eps为精度 % 黄金分割法 k_cnt0;while(b - a > eps)x1 a 0.382 * (b - a);x2 a…

OpenXML库(office文档读写库)的安装

本体安装 OpenXml库是由微软维护的一个开源的Office文档读写库&#xff0c;其与其他类似用途的库的比较可以看到这篇文章。 在C#中使用OpenXml非常简单&#xff0c;只需要使用NuGet安装其程序包即可&#xff0c;流程如下(NuGet这东西真的是个神器啊&#xff01;)&#xff1a;…