Kotlin学习之2

===比较引用

==比较值

集合类型

不可变List:List<T>

可变List:MutableList<T>

不可变Map:Map<K,V>

可变Map:MutableMap<K,V>

不可变Set:Set<T>

可变Set:MutableSet<T>

创建集合

val map:Map<String, Any>=mapOf("name" to "benny","age" to 20)

val map2:Map<String,Any>=mutableMapOf("name" to "benny","age" to 20)

val intList:List<Int> = listOf(1,2,3)

val intList2:MutableList<Int> = mutableListOf(1,2,3)

val intList3 = ArrayList<String>()

只有可变的才能添加、删除元素

集合遍历

for(i in 0..10){}

for(e in list){}

while{}

do {

} while

list.forEach{

}

集合可额外直接通过+-来添加、删除元素

val stringList = ArrayList<String>()

stringList += "a"

stringList -= "a"

还可以通过[]进行下标索引取值、赋值

stringList[1]  = "b"

特殊集合类型:Pair标识一对值、Triple表示一个三值集合

val pair = "hello" to "Kotlin

val pair = Pair("Hello", "Kotlin")

val first = pair.first

val second = pair.second

val (x, y) = pair

val triple = Triple("x" 2, 3.0)

val first = triple.first

val second = triple.second

val third = triple.third

val (x, y, z) = triple

数组类型

整形:IntArray、

整形装箱:Array<Int>

字符:CharArray

字符装箱:Array<Char>

字符串:Array<String>

数组创建

val a = IntArray(2)

a.size:数组长度

a[0]:引用数组值

遍历与集合一样

区间类型

val intRange = 1..10 闭区间,包括起止值

val intRangeExclusive = 1 until 10 不包括结束值

倒序区间

val intRangeReverse = 10 downTo 1 包括起止值

步长

val intRangeWithStep = 1..10 step 2

函数定义

fun main(args:Array<String>):Unit{

        println(args.contentToString())

}

其中函数返回值为Unit可以省略,跟Java void类型一样

函数引用

fun foo() {}  val f:()-> Unit= ::foo

fun foo(p0: Int): String {} val g:(Int)->String = ::foo

class Foo {

        fun bar(p0: String, p1: Long): Any{

        }

}

val h:(Foo, String, Long)->Any = Foo::bar

其中,等号右侧冒号前面有类名的是类对象的方法引用,在调用时也要传对象实例才行

val foo = Foo()

h(foo, "qq", 1)

变长参数:vararg

fun multiParameters(vararg ints: Int) {

}

函数默认参数

fun defaultParameter(x: Int, y: Int, z: Long = 0L) {

}

如果默认参数不是最后一个,必须使用具体参数名

fun defaultParamter(x: Int = 5, y: String, z: Long = 0L) {

}

defaultParamter(y = "hello")

高级函数,函数的参数可以是另一个函数

fun test(p: (Foo, String, Long)-> Any) {

}

val x = Foo::bar

test(x)

运算符重载

kotlin支持运算符重载,类似C++,kotlin中的==、+、>、[]、包括函数调用符号()都是kotlin中内置好的重载运算符

fun main(args: Array<String>) {val value = "Hello Kotlin"println(value - "Hello")println(value * 2)val star = "*"println(star * 20)println(value / 3)println(value / "l")println(value / "ld")
}//减
operator fun String.minus(right: Any?) = this.replaceFirst(right.toString(), "")//乘
operator fun String.times(right: Int): String {return (1..right).joinToString("") { this }
}//除
operator fun String.div(right: Any): Int {val right = right.toString()return this.windowed(right.length, 1, transform = {it == right}).count { it }
}

重载运算符的定义特点就是类定义扩展方法,方法名和运算符对应的描述,可以通过https://kotlinlang.org/docs/reference/operator-overloading.html#unary-prefix-operators

进行查询,方法前使用operator关键字修饰

lambda表达式

kotlin里的lambda表达式是一个匿名函数的语法糖,因此它的类型其实就是对应的函数类型

val func: ()->Unit = fun() {

        println("hello")

}

val func2 = {p:Int->

        println(p)

        "hello"

}

println(func2(1))

中缀函数,如果函数:是成员函数/扩展函数、只有一个参数、标有infix关键字,就可以认为是一个中缀函数

class Structure() {infix fun createPyramid(rows: Int) {var k = 0for (i in 1..rows) {k = 0for (space in 1..rows - i) {print("  ")}while (k != 2 * i - 1) {print("* ")++k}println()}}
}
fun main(args: Array<String>) {val p = Structure()p createPyramid 4
}

其本质还是类的扩展方法,前面加infix关键字,可能是为了实现更加语义化的书写方式

高阶函数

高阶函数简单来说就是函数的参数可传递另一个函数,常见于forEach表达式

val intArray = IntArray(5) { it + 1}

intArray.forEach {

        println(it)

}

intArray.forEach(::println)

intArray.forEach {

        println("Hello % it")

}

例子:定义一个函数打印方法耗时

fun cost(block: () -> Unit) {val start = System.currentTimeMillis();block()println("${System.currentTimeMillis() - start}ms")
}fun fibonacci(): () -> Long {var first = 0Lvar second = 1Lreturn {val next = first + secondval current = firstfirst = secondsecond = nextcurrent}
}
    cost {val fibonacciNext = fibonacci()for(i in 0..10) {println(fibonacciNext())}}

内联函数

添加inline关键字的函数标记为内联函数,内联函数的特点是,代码会被直接插入到调用处,编译的代码反编译的结果就是代码直接插入到调用处的结果。内联函数效率高一些。

inline fun cost(block: () -> Unit) {val start = System.currentTimeMillis();block()println("${System.currentTimeMillis() - start}ms")
}
cost {println("Hello")
}

编译后等价于

val start = System.currentTimeMillis();

block()

println("${System.currentTimeMillis() - start}ms")

内联函数的返回

val ints = intArrayOf(1, 2, 3, 4)

ints.forEach{

        if(it ==  3) return @forEach

        println("Hello $it")

}

这里面的return等价于continue,因为在非循环体内,无法使用continue,所以使用return@方法名可返回该函数的上一层。

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

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

相关文章

【Qt之QWizard】使用1

QWizard使用 描述方法枚举&#xff1a;enum QWizard::WizardButton枚举&#xff1a;enum QWizard::WizardOption枚举&#xff1a;enum QWizard::WizardStyle枚举&#xff1a;enum QWizard::WizardPixmap常用成员方法槽函数信号 示例设置标题添加page页设置按钮文本设置自定义按…

Windows配置IP-SAN(iSCSI)

之前写了《Linux配置IP-SAN&#xff08;iSCSI&#xff09;》&#xff0c;现在简单记录Windows配置IP-SAN&#xff08;iSCSI&#xff09;&#xff0c;基本过程都是一样的。一些原理请参考《Linux配置IP-SAN&#xff08;iSCSI&#xff09;》&#xff0c;更详细一些。 目录 一、确…

Windows conan环境搭建

Windows conan环境搭建 1 安装conan1.1 安装依赖软件1.1.1 python安装1.1.2 git bash安装1.1.3 安装Visual Studio Community 20191.1.3.1 选择安装的组件1.1.3.2 选择要支持的工具以及对应的SDK 1.1.4 vscode安装 1.3 验证conan功能1.4 查看conancenter是否包含poco包1.5 查看…

20231114_python练习_b站番剧视频爬取音频组合

import requests import json import re import os from pprint import pprint from moviepy.editor import *url https://api.bilibili.com/pgc/view/web/season?ep_id322903 #设置请求头 header{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) A…

Unity解决:没有UnityWebRequest.Result

当我在Unity 2019中使用Unity 2021的代码satable时。 控制台显示 “UnityWebRequest”不包含“result”的定义,并且找不到接受“UnityWebRequest”类型的第一个参数的可访问扩展方法“result”(是否缺少using指令或程序集引用?) 漏洞/问题: if (req.result == UnityWebRe…

面试官问 Spring AOP 中两种代理模式的区别?很多面试者被问懵了

面试官问 Spring AOP 中两种代理模式的区别?很多初学者栽了跟头&#xff0c;快来一起学习吧&#xff01; 代理模式是一种结构性设计模式。为对象提供一个替身&#xff0c;以控制对这个对象的访问。即通过代理对象访问目标对象&#xff0c;并允许在将请求提交给对象前后进行一…

服务器中了locked勒索病毒怎么处理,locked勒索病毒解密,数据恢复

近几年&#xff0c;网络应用技术得到了迅速发展&#xff0c;越来越多的企业开始走向数字化办公&#xff0c;极大地为企业的生产运营提供了帮助&#xff0c;但是网络技术的发展也为网络安全埋下隐患。最近&#xff0c;locked勒索病毒非常嚣张&#xff0c;几乎是每隔两个月就会对…

媒体软文投放的流程与媒体平台的选择

海内外媒体软文&#xff1a;助力信息传播与品牌建设 在当今数字化时代&#xff0c;企业如何在庞大的信息海洋中脱颖而出&#xff0c;成为品牌建设的领军者&#xff1f;媒体软文投放无疑是一项强大的策略&#xff0c;通过选择合适的平台&#xff0c;精准投放&#xff0c;可以实…

怎样做ChatGPT应用开发?

要开发一个基于ChatGPT的应用&#xff0c;你可以按照以下步骤进行&#xff1a; 步骤1&#xff1a;了解ChatGPT API ChatGPT的使用通常通过API进行。你需要了解ChatGPT的API文档&#xff0c;包括如何进行请求、API端点、身份验证等信息。在开发之前&#xff0c;确保你已经获取了…

动手学深度学习——序列模型

序列模型 1. 统计工具1.1 自回归模型1.2 马尔可夫模型 2. 训练3. 预测4. 小结 序列模型是一类机器学习模型&#xff0c;用于处理具有时序关系的数据。这些模型被广泛应用于自然语言处理、音频处理、时间序列分析等领域。 以下是几种常见的序列模型&#xff1a; 隐马尔可夫模型…

探索数据湖和大数据在亚马逊云服务云存储服务上的威力

文章作者&#xff1a;Libai 引言 在当今数字化的环境中&#xff0c;组织生成的数据量正以前所未有的速度增长。数据量的激增催生了对高效存储和管理解决方案的需求。数据湖和亚马逊云服务云存储服务上的大数据是一个强大的组合&#xff0c;使组织能够充分发挥其数据的潜力。 亚…

【ubuntu 快速熟悉】

ubuntu 快速熟悉 2.ubuntu桌面管理器3.ubuntu常见文件夹说明4.ubuntu任务管理器4.1 gnome桌面的任务管理器4.2 实时监控GPU4.3 top 命令 5.ubuntu必备命令5.1 .deb文件5.2 查找命令5.2.1 find文件搜索5.2.2 which查找可执行文件的路径5.2.3 which的进阶&#xff0c;whereis5.2.…

人工智能与充电技术:携手共创智能充电新时代

人工智能与充电技术&#xff1a;携手共创智能充电新时代 摘要&#xff1a;本文探讨了人工智能与充电技术的结合及其在未来充电设施领域的应用。通过分析智能充电系统的技术原理、优势以及挑战&#xff0c;本文展望了由人工智能驱动的充电技术为未来电动交通带来的巨大变革与机…

网易有道上线“易魔声” 开源语音合成引擎 用户可免费下载使用

网易有道上线“易魔声” 开源语音合成引擎 用户可免费下载使用 刚刚&#xff0c;我们上线了「易魔声」开源语音合成&#xff08;TTS&#xff09;引擎&#xff01;&#x1f389;&#x1f389;&#x1f389; 「易魔声」&#xff0c;是一款有道自研TTS引擎&#xff0c;目前支持中…

【Python办公】win32com打开Office、WPS文档的启动方式

1.说明 COM&#xff08;Component Object Model&#xff09;是一种面向组件的二进制接口标准&#xff0c;允许不同的软件模块之间进行交互和通信。Python中的win32com是使用Python控制com的公开库&#xff0c;对于操作软件非常方便&#xff0c;比如是操作Office软件进行文档自…

从零开始配置离线服务器

1.复制环境&#xff08;包含torch包&#xff09; 使用conda pack进行环境迁移&#xff08;步骤很详细&#xff09;_小舟%的博客-CSDN博客 注意&#xff1a;用pack的时候会默认把生成的tar.gz保存到当前目录&#xff0c;所以提前需要观测好在哪 注意&#xff1a;公用的环境必…

循环双链表插入删除

#include <iostream>#include <stdio.h> #include <stdlib.h>using namespace std;//带头指针的循环双链表typedef struct DNode{int data;struct DNode *next,*prior;}DNode, *DLinkList; // 初始化 bool initDlinklist(DLinkList &L){L (DNode *)ma…

【NI-DAQmx入门】多通道数据采集

1.通道扩展解释 通道扩展是扩展数据采集设备的通道以包含另一个设备的通道的过程&#xff0c;从而有效地创建具有更多通道的任务。当使用通道扩展时&#xff0c;DAQmx 自动在 DAQmx 驱动程序级别路由触发器和时钟&#xff0c;以便多个设备同步。为了使设备作为一个整体运行&…

MongoDB 索引

类似关系型数据库&#xff0c;mongodb也建立自己的一套索引机制和查询优化方法。本文简单介绍mongodb的索引。后续文章讲详细介绍索引的操作&#xff0c;监控和查询优化方法等。 索引 索引&#xff0c;是一组按照特殊结构排列的&#xff0c;方便检索的数据。索引中保存了集合…

笔试题之指针和数组的精讲

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…