kotlin必备基础一

news2024/9/25 15:30:12

在这里插入图片描述

kotlin 必备基础

  • 方法的声明
      • 成员方法
      • 类方法(静态方法)
      • 单表达式方法
      • 局部方法
  • 方法高级特性
      • 高阶函数
        • 函数作为参数
        • 函数作为返回值
      • 闭包(Cloure)
        • 闭包的特性
        • 闭包的好处
      • 解构申明
      • 匿名方法
      • kotlin 方法字面值
  • 方法参数
      • 默认参数
      • 可变数量参数
    • Lambda 表达式
      • 特点
      • Lambda 语法
      • 认识it
      • 如何使用下划线_

方法的声明

在这里插入图片描述

fun main() {
    println(functionLearn(10))
}

fun functionLearn(days:Int):Boolean{
    return days>100
}

在kotlin 中,函数是一等公民,可以直接申明。无须写在类中

成员方法

fun main(){
	Person().test1()
}
class Person{
	fun test1(){
		println("成员方法")
	}
}

类方法(静态方法)

在kotlin 中没有static 关键字,需要使用 companin object(伴生对象)

fun main(){
	Person().test1()
	Person.test2()
}
class Person{
	fun test1(){
		println("成员方法")
	}
	companion object {
		fun test2(){
		println("类方法")
		}
	}
}

通过object 修饰类,可以定义一个静态类。如下
应用场景:工具类

fun main(){
	NumUtil.double(2)
}
object NumUtil{
	fun double(num :Int):Int{
		return num*2
	}
}

单表达式方法

当方法返回单个表达式时,可以省略花括号并且在 = 符号之后指定代码体即可

fun double(x:Int):Int = x*2

局部方法

kotlin 方法可以申明在一些局部的作用域里(在方法中再定义方法)


fun main(){
	 magic()
}
fun magic(){
	fun foo(v:Int):Int{
		return 	v*v
	}
	
	val v1=(0..100).random()
	return foo(v1)
}

方法高级特性

在这里插入图片描述

高阶函数

定义:将函数作为参数或者作为返回值的函数

函数作为参数

fun main(){
    val list = listOf<Int>(1,2,3)
    val result= list.sum{
        println("${it}")
    }
    println("result ${result}")
}


fun List<Int>.sum(callback:(Int)->Unit):Int{
    var result = 0
    for(v in this){//this 代表 List<Int>
        result+=v
        callback(v)
    }
    return result
}

函数作为返回值

fun main() {
    val listString = listOf<String>("1","2","3","4")
    val  result2=listString.toIntSum()(2)
    println("计算结果${result2}")
}
fun List<String>.toIntSum(): (scale: Int) -> Float {
    println("第一层函数")
    return fun(scale): Float {
        var result = 0f
        for (v in this) {
            result += v.toInt() * scale
        }
        return result
    }
}

闭包(Cloure)

闭包可以理解为能够读取其他方法内部变量的方法
闭包是将方法内部和方法外部连接起来的桥梁

闭包的特性

  • 方法可以作为另一个方法的返回值或参数,还可以作为一个变量的值
  • 方法可以嵌套定义,即在一个方法内部可以定义另一个方法

闭包的好处

  • 加强模块化(能够已简单的方式开发较小的模块,从而提高开发速率,和程序的复用性)
  • 抽象(闭包是数据和行为的一些组合,使得闭包拥有较好的抽象能力)
  • 灵活
  • 代码简洁

示例

fun main(){
	testClosure(1)(2){
        println(it)
    }
}
fun testClosure(v1: Int): (v2:Int, (Int) -> Unit) -> Unit {
    return fun(v2: Int, printer: (Int) -> Unit) {
        printer(v1+v2)
    }
}

解构申明

data class Result(var msg:String , var code:Int)
fun test1(){
	var result = Result("succecs",0)
	val (msg,code)=result
	println("msg: ${msg}  code:${code}")
}

匿名方法

顾名思义没有方法名的方法就叫匿名方法

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

kotlin 方法字面值

可以理解为未申明的方法

//定义了一个变量temp ,而变量的类型是(Int)->Boolean 是个函数

fun test2(){
	var temp:((Int)-> Boolean)?=null
	//{num -> (num>10)} 方法字面值
	temp = {num -> (num>10)}
	println("temp(11) : ${temp(11)}")
}

方法参数

默认参数

方法参数可以有默认值,当省略相应的参数时使用默认值
优点:与Java相比,这可以减少重载数量

fun read(b:Array<Byte>,off:Int=0,len:Int =b.size){
}

可变数量参数

通过vararg 来修饰可变数量的参数

fun main(){
	println(append('a','b','c'))
}
fun append(vararg str:Char):String{
	val result = StringBuffer()
	for(char in str){
		result.append(char)
	}
	return result.toString()
}

Lambda 表达式

特点

view.setOnClickListener(new View.OnClickListener(){
	@Override
	public void onClick(View v){
		Toast.markText(v.getContent(),"lambda 简介之道",Toast.LENGth_LONG).show();
	}
})

VS

view.setOnClickListener{ v -> Toast.markText(v.getContent(),"lambda 简介之道",Toast.LENGth_LONG).show();}
  • 是匿名方法
  • 二是可传递(Lambda 表达式可作为参数传递)

Lambda 语法

无参数情况:

var/val 变量名 = {操作的代码}

fun test(){
	println("无参数")
}
//lambda 语法
val test = {println("无参数")}

有参数的情况

var/val 变量名:(参数的类型,参数类型,...) -> 返回值类型 = {参数1,参数2 -> 
	操作的代码
}
val test1:(Int,Int) ->Int={a,b -> 
	a+b
}
等价于
var/val 变量名 = {参数1:类型,参数2:类型,... ->
	操作参数的代码
	}
val test1={a:Int,b:Int ->
	a+b
}

认识it

  • it 并不是kotlin 中的一个关键字(保留字)
  • it 是在当一个高阶方法中Lambda 表达式的参数只有一个的时候可以使用it 来使用此参数
  • it 可表示为单个参数的隐式名称,是kotlin 语言约定的
//这里举例一个kotlin 语言自带的一个高阶方法filter ,此方法的作用是过滤掉不满足条件的值
val arr = arrayOf(1,3,5,7,9)
//过滤掉数组中元素小于2的元素,取其第一个打印。这里的it就表示每一个元素
println(arr.filter{it <5}.component1())

如何使用下划线_

在使用lambda 表达时的时候,可以用下划线(_)表示未使用的参数,表示不处理这个参数。
在遍历一个Map 集合的时候,这当非常有用

val map=mapOf("key1" to "vul1","key2" to "vul2")
map.forEach{(key,value)->
	println("$key $ value")
} 
//当不需要key 时
map.forEach{(_,value)->
    println(" $ value")
}

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

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

相关文章

【机器学习】K近邻算法(K-NearestNeighbors , KNN)详解 + Java代码实现

文章目录一、KNN 基本介绍二、KNN 核心思想三、KNN 算法流程四、KNN 优缺点五、Java 代码实现 KNN六、KNN 改进策略一、KNN 基本介绍 邻近算法&#xff0c;或者说K最邻近&#xff08;KNN&#xff0c;K-NearestNeighbors&#xff09;分类算法是分类方法中最简单的方法之一。所谓…

Cadence PCB仿真使用Allegro PCB SI为分立元件创建统一的模型并赋值方法图文教程

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,配置方法3,总结1,概述 本文简单介绍使用Allegro PCB SI软件配置电压地网络电压的方法。 2,配置方法 第1步:打开待仿真的PCB文件,并确认软件为Allegro PCB SI 如果,打开软件不是Allegro PCB SI则可这样…

[ 数据结构 ] 背包问题(动态规划)

0 背包问题 有一个背包,容量为4磅,现有如下物品 物品重量价格吉他(G)11500音响(S)43000电脑(L)32000 1)要求达到的目标为装入的背包的总价值最大&#xff0c;并且重量不超出 2)要求装入的物品不能重复(01背包) 1 动态规划 动态规划(Dynamic Programming)算法的核心思想是&…

从0到1完成一个Vue后台管理项目(十一、前端分页实现)

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; 从0到1完成一个Vu…

测试分析--精准分析

测试分析的概念 测试分析是建立在对「需求本身」、「用户使用场景」以及对应的「系统架构」和「实现细节」的充分了解的基础上&#xff0c;通过对数据流、状态变化、逻辑时序、功能/性能/兼容性等方面的分析&#xff0c;得出测试点的过程&#xff1b; 在现阶段敏捷开发模式普遍…

【部分真题】2022年12月QMS质量管理体系试题(1-5题)尚大解析版

注1&#xff1a;由于是机考&#xff0c;题目顺序随机变化&#xff0c;但题目内容所有考生一致。 注2&#xff1a;选择题的选项顺序会随机改变&#xff0c;但选项的内容不变。 注3&#xff1a;为了方便学员学习与复习&#xff0c;已经按教程&考试大纲进行全面优化排序。 注4…

4644. 求和

4644. 求和 https://www.acwing.com/problem/content/description/4647/ 第十三届蓝桥杯省赛CA/C组 , 第十三届蓝桥杯省赛JAVAA组 算法标签&#xff1a;推公式&#xff1b;前缀和 思路 推公式做法&#xff1a; (a1a2a3...an)2a12a22a32...an22a1a22a1a3...2a1an2a2a3...2an−…

【模板】最小生成树(C++)

题目描述 如题&#xff0c;给出一个无向图&#xff0c;求出最小生成树&#xff0c;如果该图不连通&#xff0c;则输出 orz。 输入格式 第一行包含两个整数 N,MN,MN,M&#xff0c;表示该图共有 NNN 个结点和 MMM 条无向边。 接下来 MMM 行每行包含三个整数 Xi,Yi,ZiX_i,Y_i,…

设计师必备的免费样机素材

很多设计师会用样机模型来展示自己的作品&#xff0c;让设计图案、应用界面等作品应用到实物效果图中&#xff0c;能体现作品的最终效果&#xff0c;更加形象逼真。哪里能下载到样机模板呢&#xff1f;今天我就推荐6个网站帮你解决&#xff0c;赶紧收藏&#xff01; 1、菜鸟图库…

20230109测试ToyBrick的RK3588开发板运行Buildroot的V0.02版本(20220312)

20230109测试ToyBrick的RK3588开发板运行Buildroot的V0.02版本&#xff08;20220312&#xff09; 2023/1/9 18:03 https://wiki.t-firefly.com/zh_CN/Firefly-Linux-Guide/manual_buildroot.html 1. Buildroot 使用手册 1.1. 桌面应用 官方发布的 Buildroot 固件&#xff0c;默…

RabbitMQ学习一【尚硅谷】

一、消息队列 1、MQ的相关概念 2、RabbitMQ 2.1 四大核心概念 生产者&#xff1a; 交换机&#xff1a;交换机是 RabbitMQ非常重要的一个部件&#xff0c;一方面它接收来自生产者的消息&#xff0c;另一方面它将消息 推送到队列中。交换机必须确切知道如何处理它接收到的消息…

一文详解Linux Python3安装

在公司申请了一台CentOS 7的Linux版本虚拟机&#xff0c;需要安装一个Python3的环境&#xff0c;定期进行特定任务处理。这里对CentOS 7配置Python3环境的步骤进行了记录&#xff0c;供大家参考。 本文基于如下Linux系统版本&#xff1a; 一、默认Python版本 默认情况下&am…

Excelize 2.7.0 发布, 2023 年首个更新

Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库&#xff0c;基于 ECMA-376&#xff0c;ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式&#xf…

C 程序设计教程(13)—— 顺序结构程序设计练习题

C 程序设计教程&#xff08;13&#xff09;—— 顺序结构程序设计练习题 该专栏主要介绍 C 语言的基本语法&#xff0c;作为《程序设计语言》课程的课件与参考资料&#xff0c;用于《程序设计语言》课程的教学&#xff0c;供入门级用户阅读。 目录C 程序设计教程&#xff08;1…

【openGauss】在openEuler(ARM架构)上安装openGauss(一主两备含CM版)

一、系统版本介绍 当前案例中的openGauss安装&#xff0c;底层操作系统为openEuler-20.03-LTS版本&#xff0c;当前openGauss对Python版本兼容性最好的是Python 3.6版本与Python 3.7版本&#xff0c;该实验使用的openEuler版本自带Python 3.7.4&#xff0c;不需要再自行安装 二…

汽车电子系统网络安全活动

声明 本文是学习GB-T 38628-2020 信息安全技术 汽车电子系统网络安全指南. 下载地址 http://github5.com/view/764而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 汽车电子系统网络安全活动 7.1 概念设计阶段 7.1.1 概述 概念设计阶段的活动流程如图…

房产管理系统分布架构分析

一、数图互通房产管理系统采用分布式架构下的高可用设计&#xff1a; &#xff08;1)可以避免因单点故障造成系统平台宕机&#xff1a; a、负载均衡技术&#xff08;failover &#xff0c;选址&#xff0c;硬件负载&#xff0c;软件负载&#xff0c;去中心化负载&#xff08;g…

tp5处理前端上传的图片文件

前端上传了一个图片文件,tp5框架如何处理 效果图&#xff1a; 效果图一: 效果图二: 如果需要看前端如何展示、删除上传的缩略图请到此篇博客&#xff1a; 前端&#xff1a; <form id"upload_pic_wrap" target"upload_file" enctype"multipar…

任务间通讯

信号量与邮箱 系统中的多个任务在运行时&#xff0c;经常需要互相无冲突地访问同一个共享资源&#xff0c;或者需要互相支持和依赖&#xff0c;甚至有时还要互相加以必要的限制和制约&#xff0c;才保证任务的顺利运行。因此&#xff0c;操作系统必须具有对任务的运行进行协调…

C++11引入的尾置返回类型

C11引入的尾置返回类型一、什么是尾置返回类型(trailing return type)二、尾置返回的典型场景2.1 常规方式如何返回数组指针2.2 使用尾置返回类型三、尾置返回类型的应用四、总结一、什么是尾置返回类型(trailing return type) 我们先来看一下传统的函数是怎么定义的&#xff…