Kotlin基本语法

以下内容摘自郭霖《第一行代码》第三版

文章目录

    • Kotlin变量
    • Kotlin循环语句
    • Kotlin条件语句
    • Kotlin继承
    • Kotlin主构造函数与次构造函数
    • Kotlin实现
    • Kotlin函数的可见性修饰符
    • Kotlin data关键字
    • Kotlin单例模式
    • Kotlin List集合
    • Kotlin Set集合
    • Kotlin Map映射
    • Kotlin Lamda表达式
    • Kotlin any和all函数
    • Kotlin线程
    • Kotlin空指针问题
      • Kotlin判空辅助工具
      • let函数
    • Kotlin字符串内嵌表达式
    • Kotlin函数的参数设置

Kotlin变量

  • val 表示不可变变量,类似于Java中用final关键字修饰的变量
  • var表示可变变量

Kotlin循环语句

… 左闭右闭

until 左闭右开

downTo 倒序左闭右闭

step 代表每次递增的数字

ps:主要用于for循环和while循环等

Kotlin条件语句

Kotlin中条件语句用when关键词

fun getScore(name: String) = when(name){"Tom" -> 86"Jim" -> 77"Jack" -> 95"Lily" -> 100else -> 0           // 相当于switch-case语句里面的default
}fun getScore2(name: String) = when{name.startsWith("Tom") -> 86name == "Jim" -> 77name == "Jack" -> 95name == "Lily" -> 100else -> 0           // 相当于switch-case语句里面的default
}fun checkNumber(num: Number){when(num){is Int -> println("number is Int")is Double -> println("number is Double")is Float -> println("number is Float")else -> println("number is not support")}
}

Kotlin继承

在Kotlin中任何一个非抽象类默认都是不可以被继承的

:用来表示继承关系,而且需要被继承的类在关键字class前面加上open

open class Person(){var name = ""var age = 0
}
class Student: Person(){var sno = ""var grade = 0
}

Kotlin主构造函数与次构造函数

  1. 主构造函数只能有一个,次构造函数可以有多个
  2. 次构造函数通过constructor关键字来定义
  3. Kotlin中允许可以只有次构造函数,没有主构造函数
class Student: Person{constructor(name: String, age: Int): super(name, age){}
}

Kotlin实现

使用,来表示实现关系,并且不需要加括号

允许对接口中定义的函数进行默认实现

interface Study {fun readBooks()fun doHomework(){println("do homework default implementation.")}
}

Kotlin函数的可见性修饰符

Java中是private、protected、public和default(默认项)

Kotlin中是private(同Java)、protected(只对当前类和子类可见)、public(默认项,同Java)和internal(比如我们开发了一个模块给别人使用,但是有一些函数只允许在模块内部调用,不想暴露给外部,就可以将这些函数声明成internal)

修饰符JavaKotlin
public所有类可见所有类可见(默认)
protected当前类、子类、同一包路径下的类可见当前类、子类可见
private当前类可见当前类可见
default同一包路径下的类可见(默认)
internal同一模块中的类可见

Kotlin data关键字

当在一个类前面声明了data关键字时,就表明你希望这个类是一个数据类,Kotlin会根据主构造函数中的参数帮你将equals()、hashCode()、toString()等固定且无实际逻辑意义的方法自动生成。

Kotlin单例模式

直接将class关键字改为object关键字

object Singleton {fun singletonTest(){println("singletonTest is called.")}
}

调用单例类中的函数比较类似于Java中静态方法的调用方式:

Singleton.singletonTest()

Kotlin List集合

// listOf表示不可变的集合,即该集合只可读
val list = listOf("apple", "banana", "orange", "pear", "Grape")
for(fruit in list){println(fruit)
}
// 获取单词长度最大的那个
println("The max length of list is " + list.maxBy { it.length })// mutableListOf表示可变的集合
val list1 = mutableListOf("apple", "banana", "orange", "pear", "Grape")
list1.add("watermelon")
for(fruit in list1){println(fruit)
}

Kotlin Set集合

val set = setOf("apple", "banana", "orange", "pear", "Grape", "banana")
for(fruit in set){println(fruit)
}val set1 = mutableSetOf("apple", "banana", "orange", "pear", "Grape", "banana")
set1.add("watermelon")
set1.add("orange")
for(fruit in set1){println(fruit)
}

Kotlin Map映射

val map = HashMap<String, Int>()
map.put("Apple", 1)
map.put("banana", 2)
map.put("orange", 3)
map.put("pear", 4)
map.put("grape", 5)val number = map.get("Apple")// 不建议使用上述get()和put()方法,建议使用以下方法
map["Apple"] = 1
map["banana"] = 2
map["orange"] = 3
map["pear"] = 4
map["grape"] = 5val number = map["Apple"]// 但是还有更简单的方法
val map = mapOf("Apple" to 1, "Banana" to 2, "Orange" to 3, "Pear" to 4, "Grape" to 5)
// 遍历
for((fruit, number) in map){println("fruit is " + fruit + ", number is " + number)
}

Kotlin Lamda表达式

语法结构:

{参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}

首先最外层是一对大括号,如果有参数传入到Lambda表达式中的话,我们还需要声明参数列表,参数列表的结尾使用一个->符号,表示参数列表的结束以及函数体的开始,函数体中可以编写任意行代码(虽然不建议编写太长的代码),并且最后一行代码会自动作为Lambda表达式的返回值。

val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
val lambda = {fruit: String -> fruit.length}
val maxLengthFruit = list.maxBy(lambda)
println("The max length of list is " + maxLengthFruit)// 进行简化
val maxLengthFruit = list.maxBy({fruit: String -> fruit.length})
// Kotlin规定,当Lambda参数是函数的最后一个参数时,可以将Lambda表达式移到函数括号的外面
val maxLengthFruit = list.maxBy(){fruit: String -> fruit.length}
// 如果Lambda参数是函数的唯一一个参数的话,还可以将函数的括号省略
val maxLengthFruit = list.maxBy{fruit: String -> fruit.length}
// 由于Kotlin拥有出色的类型推导机制,Lambda表达式中的参数列表其实在大多数情况下不必声明参数类型
val maxLengthFruit = list.maxBy{fruit -> fruit.length}
// 当Lambda表达式的参数列表中只有一个参数时,也不必声明参数名,而是可以使用it关键字来代替
val maxLengthFruit = list.maxBy { it.length }

filter函数是用来过滤集合中的数据的,它可以单独使用,也可以配合刚才的map函数一起使用。

fun main() {val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")val newList = list.filter { it.length <= 5 }.map { it.toUpperCase() }for (fruit in newList) {println(fruit)}
}

Kotlin any和all函数

any函数用于判断集合中是否至少存在一个元素满足指定条件,all函数用于判断集合中是否所有元素都满足指定条件。

val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")
var anyResult = list.any { it.length <= 5 }
var allResult = list.all { it.length <= 5 }
// anyResult = true, allResult = false
println("anyResult = " + anyResult + ", allResult = " + allResult)

Kotlin线程

Thread(object: Runnable{override fun run() {println("Thread is running...")}
}).start()// 对代码进行精简
Thread(Runnable { println("Thread is running...")
}).start()// 再精简
Thread({ println("Thread is running...")
}).start()// 继续精简
Thread{ println("Thread is running...")
}.start()

Kotlin空指针问题

Kotlin默认所有的参数和变量都不可为空,Kotlin将空指针异常的检查提前到了编译时期

可为空的类型:在类名的后面加上一个问号。Int表示不可为空的整型,而Int?就表示可为空的整型;String表示不可为空的字符串,而String?就表示可为空的字符串

Kotlin判空辅助工具

?.操作符。当对象不为空时正常调用相应的方法,当对象为空时则什么都不做。

if (a != null) {a.doSomething()
}// 直接替换为
a?.doSomething()

?:操作符。这个操作符的左右两边都接收一个表达式,如果左边表达式的结果不为空就返回左边表达式的结果,否则就返回右边表达式的结果。

var a: Int = 10
var b: Int = 20val c = if(a != null){a
}else{b
}// 直接替换为
val c1 = a ?: b

想要强行通过编译,使用非空断言,在对象后面加上!!。这是一种有风险的写法意在告诉Kotlin,我非常确信这里的对象不会为空,所以不用你来帮我做空指针检查了,如果出现问题,你可以直接抛出空指针异常,后果由我自己承担。(有风险)

var content: String? = "hello"
fun main() {if (content != null) {printUpperCase()}
}
fun printUpperCase() {val upperCase = content.toUpperCase()println(upperCase)
}

这个代码是无法通过编译的,需要改成以下代码:

fun printUpperCase() {val upperCase = content!!.toUpperCase()println(upperCase)
}

let函数

// 本来我们进行一次if判断就能随意调用study对象的任何方法,但受制于?.操作符的限制,现在变成了每次调用study对象的方法时都要进行一次if判断
fun doStudy(study: Study?){if(study != null){study.doHomework()}if(study != null){study.readBooks()}
}// 结合使用?.操作符和let函数来对代码进行优化
fun doStudy1(study: Study?){study?.let { stu ->stu.doHomework()stu.readBooks()}
}// 当Lambda表达式的参数列表中只有一个参数时,可以不用声明参数名,直接使用it关键字来代替即可
fun doStudy3(study: Study?){study?.let { it.doHomework()it.readBooks()}
}

let函数是可以处理全局变量的判空问题的,而if判断语句则无法做到这一点

Kotlin字符串内嵌表达式

val name = "Annie"
val str = "hello, $name. Nice to meet you!"

Kotlin函数的参数设置

可以通过键值对的方式来传参,从而不必像传统写法那样按照参数定义的顺序来传参

fun printParams(num: Int = 100, str: String) {println("num is $num , str is $str")
}
fun main() {printParams(str = "world")
}

当次构造函数的作用是提供使用更少参数来对类进行实例化的方式时,我们完全可以通过只编写一个主构造函数,然后给参数设定默认值的方式来实现。

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

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

相关文章

GPT最佳实践:五分钟打造你自己的GPT

前几天OpenAI的My GPTs栏目还是灰色的&#xff0c;就在今天已经开放使用了。有幸第一时间体验了一把生成自己的GPT&#xff0c;效果着实惊艳&#xff01;&#xff01;&#xff01;我打造的GPT模型我会放到文章末尾&#xff0c;大家感兴趣也可以自己体验一下。 打造自己的GPT模型…

k8s metadata.labels,spec.template.metadata.labels,spec.selector 三者之间的关系。

在 Kubernetes 配置文件中&#xff0c;metadata.labels 和 spec.selector 通常在一起使用&#xff0c;。他们起着不同的作用&#xff1a; metadata.labels&#xff1a;这些标签&#xff08;labels&#xff09;附加在你创建的对象&#xff08;例如 Pod、Service、或 Deployment&…

Linux学习之进程三

目录 进程控制 fork函数 什么是写时拷贝 进程终止 mian函数的返回值 退出码 错误码 exit() 进程等待 1.什么是进程等待&#xff1f; 2.为什么要进行进程等待&#xff1f; 3.如何进程进程等待&#xff1f; wait&#xff0c;waitpid&#xff1a; waitpid 进程替换 …

leaflet

Leaflet 是一个为建设移动设备友好的互动地图&#xff0c;而开发的现代的、开源的 JavaScript 库。它是由 Vladimir Agafonkin 带领一个专业贡献者团队开发&#xff0c;虽然代码仅有 33 KB&#xff0c;但它具有开发人员开发在线地图的大部分功能。 leafLet入门教程兼leafLet A…

Flink—— Flink Data transformation(转换)

Flink数据算子转换有很多类型&#xff0c;各位看官看好&#xff0c;接下来&#xff0c;演示其中的十八种类型。 1.Map&#xff08;映射转换&#xff09; DataStream → DataStream 将函数作用在集合中的每一个元素上,并返回作用后的结果&#xff0c;其中输入是一个数据流&…

Kibana Dashboard饼图展示keyword子字符串去重统计

日志内容 log.info("请求开始 uri: {} header RequestId:{}", request.getRequestURI(), reqId, request.getHeader("request_id"));操作步骤 进入Dashboard菜单 点击Create Dashboard按钮 点击Create Panel按钮 选择Aggregation based 然后选择Pie饼图 …

【JAVA】字符截取包含中文字符情况

问题 需求:给定一个中英文字符串&#xff0c;截取固定长度后存储数据 情况&#xff1a;中文占用2个字节,英文1个 //org.apache.commons.lang3.StringUtils.substring(columnVal, 0, lenMax)public static String substring(String str, int start, int end) {if (str null) {…

开源论道 源聚一堂@COSCon

自2015年以来&#xff0c;开源高峰论坛一直是中国开源年会中的传统亮点项目。本次在COSCon23 大会期间的高峰圆桌会&#xff0c;于2023年10月29日在成都高新区的菁蓉汇召开。 本次高峰圆桌上&#xff0c;我们特别邀请了20 位来自企业&#xff0c;基金会和社区的专家和领袖参加讨…

京东数据分析:2023年10月京东洗衣机行业品牌销售排行榜

鲸参谋监测的京东平台10月份洗衣机市场销售数据已出炉&#xff01; 10月份&#xff0c;洗衣机市场整体销售呈上升走势。鲸参谋数据显示&#xff0c;今年10月&#xff0c;京东平台洗衣机市场的销量为143万&#xff0c;环比增长约23%&#xff0c;同比增长约1%&#xff1b;销售额约…

AI:76-基于机器学习的智能城市交通管理

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

物联网AI MicroPython学习之语法 ustruct 打包和解压原始数据类型

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; ustruct 介绍 ustruct提供打包和解压原始数据类型的功能。 默认情况下&#xff0c;C类型以机器的本机格式和字节顺序表示&#xff0c;并在必要时通过跳过填充字节来正确对齐&#xff08;根据C编译器使用的规…

Ubuntu 20.04 中配置NFS服务

NFS是Network File System的首字母缩写。它是一种分布式协议&#xff0c;使客户端可以访问远程服务器上的共享文件。 1、安装NFS服务端 $ sudo apt install nfs-kernel-server 检查nfs-server是否已经启动 $ sudo systemctl status nfs-server 2、创建NFS共享目录 下一步…

STL常用库函数复习

文章目录 pairvectorliststackqueuequeuepriority_queuequeue双端队列 set✨set集合✨multiset 多重集合了解&#xff1a;unordered_set 无序集合 map&#x1f31f;map几乎不用&#xff1a;multimap一般不用&#xff1a;undered_map pair utility示例 #include <iostream&…

DAY48 121. 买卖股票的最佳时机 + 122.买卖股票的最佳时机II

121. 买卖股票的最佳时机 题目要求&#xff1a; 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择某一天买入这只股票&#xff0c;并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润…

调用API接口获取淘宝商品评论:方法与实战

一、引言 淘宝作为中国最大的电商平台之一&#xff0c;提供了丰富的商品信息和用户评价数据。对于开发者、数据分析师或电商从业者来说&#xff0c;获取淘宝商品评论数据具有重要的应用价值。本文将详细介绍如何调用淘宝API接口来获取商品评论数据&#xff0c;并给出相应的代码…

【教3妹学编程-算法题】 在树上执行操作以后得到的最大分数

3妹&#xff1a;2哥&#xff0c;今日都立冬了&#xff0c; 可是天气一点都不冷。 2哥 : 立冬了&#xff0c;晚上要不要一起出去吃饺子&#xff1f;&#x1f95f; 3妹&#xff1a;好呀好呀&#xff0c;2哥请吃饺子喽 2哥 : 歪歪&#xff0c;我说的是一起出去吃&#xff0c;没说我…

以 Kubernetes 原生方式实现多集群告警

作者&#xff1a;向军涛、雷万钧 来源&#xff1a;2023 上海 KubeCon 分享 可观测性来源 在 Kubernetes 集群上&#xff0c;各个维度的可观测性数据&#xff0c;可以让我们及时了解集群上应用的状态&#xff0c;以及集群本身的状态。 Metrics 指标&#xff1a;监控对象状态的量…

C++day6作业

1.思维导图 2.编程题&#xff1a; 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&am…

[autojs]用户界面GUI编程

用户界面: UI视图: View attr(name, value)attr(name)whidgravitylayout_gravitymarginmarginLeftmarginRightmarginTopmarginBottompaddingpaddingLeftpaddingRightpaddingToppaddingBottombgalphaforegroundminHeightminWidthvisibilityrotationtransformPivotXtransformPivo…

5-爬虫-打码平台、打码平台自动登录打码平台、selenium爬取京东商品信息、scrapy介绍安装、scrapy目录结构

1 打码平台 1.1 案例 2 打码平台自动登录打码平台 3 selenium爬取京东商品信息 4 scrapy介绍安装 5 scrapy目录结构 1 打码平台 # 1 登录某些网站&#xff0c;会有验证码---》想自动破解-数字字母&#xff1a;python模块&#xff1a;ddddocr-计算题&#xff0c;成语题&#xf…