kotlin快速入门1

news2025/3/1 2:07:37

在Google I/O 2017中,Google 宣布 Kotlin 成为 Android 官方开发语言。目前主流AndroidApp开发已经全部切换成此语言,因此对于Android开发而言,掌握Kotlin已经变成必要事情。

Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。

同时,Kotlin 可以编译成Java字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。

基础语法

Kotlin 文件以 .kt 为后缀。

包声明

代码文件的开头一般为包的声明:

package kotlin.math.max
import java.util.*
fun test(){}
class LearnKotlin{}

kotlin中的源文件不需要相匹配的目录和包,源文件可以放在任何文件目录。

以上例中 test() 的全名是 kotlin.math.max.test、LearnKotlin的全名是 kotlin.math.max.LearnKotlin

如果没有指定包,默认为 default 包。

默认导入

有多个包会默认导入到每个 Kotlin 文件中:

kotlin.*

kotlin.annotation.*

kotlin.collections.*

kotlin.comparisons.*

kotlin.io.*

kotlin.ranges.*

kotlin.sequences.*

kotlin.text.*

函数定义

函数定义使用关键字 fun,参数格式为:参数 : 类型

fun addNumbers(num1:Int,num2:Int):Int{ //参数和返回值类型都为Int
    return num1 + num2
}

在这其中,表达式作为函数体,返回类型自动推断:

fun addNumbers(num1:Int,num2:Int) = num1 + num2

无返回值的函数(类似Java中的void):

fun printSum(num1: Int, num2: Int): Unit {
    print(num1 + num2)
}

如果是返回 Unit类型,则可以省略,如:

fun printSum(num1: Int, num2: Int) {
    print(num1 + num2)
}

可变长参数函数

函数的变长参数可以用 vararg 关键字进行标识,例如下面方法:

fun varsPrint(vararg v:Int){
    for(vt in v){
        println(vt)
    }
}

我们将其在main中调用:

fun main(){
    varsPrint(0,1,2,3,4,5,6)
}

可看到对应控制台输出:

lambda(匿名函数)

lambda表达式使用实例:

fun main(){
    val addLambda: (Int, Int) -> Int = {num1,num2 -> num1+num2}
    println(addLambda(2,3))
}

对应在控制台打印:

定义常量与变量

可变变量(variable)定义关键字:var

var <变量名> : <类型> = <初始化值>

不可变变量(value)定义关键字:val,只能赋值一次的变量(类似Java中final修饰的变量)

val <变量名> : <类型> = <初始化值>

注意:常量与变量都可以没有初始化值,但是在引用前必须初始化;

编译器支持自动类型判断,即声明时可以不指定类型,由编译器判断。

val num1: Int = 1
val num2 = 1       // kotlin类型自动推断变量类型为Int

val num3: Int      // 如果不在声明时初始化则必须提供变量类型
num3 = 1           // 然后明确赋值

var num = 5        // 系统自动推断变量类型为Int
num += 1           // 变量可修改

如果对于val类型声明出的变量后面进行修改会被提示错误如下:

注释

Kotlin 一样支持单行和多行注释,如:

// 这是一个单行注释

/* 这是一个多行
   注释 */

字符串模版

$ 表示一个变量名或者变量值

$varClass 表示变量值

${varClass .fun()} 表示变量的方法返回值:

如下:

var a = 1
val s1 = "a is $a"

a = 2
// 模板中的任意表达式:
val s2 = "${s1.replace("is", "was")}, but now is $a"
println(s1)
println(s2)

对应输出为:

空指针检查机制

Kotlin中的空指针安全设计主要针对于声明可为空的参数,在使用时进行判空处理,相对应有两种处理方式:

  1. 字段后加!!像Java一样抛出空异常;
  2. 字段后加?可不做处理返回值为 null或配合?:做判空处理。
//类型后面加?表示可为空
var numbers: String? = "23"

//抛出空指针异常
val numbers1 = numbers!!.toInt()

//不做处理返回 null
val numbers2 = numbers?.toInt()

//numbers为空则返回-1
val numbers3 = numbers?.toInt() ?: -1

当一个引用可能为 null 时, 对应的类型声明必须明确地标记为可为 null。

例如下面代码则表示当 string 中的字符串内容不是一个整数时, 返回 null:

fun parseInt(str: String): Int? {
    // ...
}

类型检测及自动类型转换

关键运算符: is  

类似于Java中的instanceof关键字,用于检测一个表达式是否某类型的一个实例,如:

fun getStrLength(str: Any): Int? {
    if (str is String) {
        // 在这做过类型判断后,obj会被系统自动转换为String类型
        return str.length
    }

    //与Java中instanceof不同,可以使用!is做相反判断
    // if (str !is String){
    //   // XXX
    // }

    // 这里的obj仍然是Any类型的引用
    return null
}

(Any类型后续会讲到,这里仅用举例可以理解为某种类型)

区间

区间表达式由具有操作符形式 .. 的 rangeTo 函数辅以 in 和 !in 形成。常被用与for循环中,即for-in循环。

区间是为任何可比较类型定义的,但对于整型原生类型,它有一些优化的实现,如下:

val range = 0..10

上述代码表示创建了一个0到10的区间,并且两端都是闭区间,即[0,10]。在很多情况下,双端闭区间不如单端闭区间好用,与之对应,可以用until关键字来创建一个左闭右开的区间,如:

val range = 0 until 10

对应数学表达式是[0,10)。

stepdownTo关键字

step关键字主要用在for循环中跳过其中的一些元素。如:

for (i in 0 until 10 step 2){
    println(i)
}

对应输出为:

..和until关键字都要求区间的左端必须小于区间的右端,也就是这两种关键字创建的都是一个升序的区间。对应降序区间关键字为downTo,此关键字也可以使用step进行跳过。

总示例如下:

print("区别输出:")
for (i in 1..8) print(i) // 输出“12345678”
println("\n----------------")
print("设置step:")
for (i in 1..8 step 2) print(i) // 输出“1357”
println("\n----------------")
print("使用 downTo:")
for (i in 8 downTo 1 step 2) print(i) // 输出“8642”
println("\n----------------")
print("使用 until:")
// 使用 until 函数排除结束元素
for (i in 1 until 8) {   // i in [1, 8) 排除了 8
    print(i)
}
println("\n----------------")

 对应输出为:

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

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

相关文章

超声波防碰撞电路原理图

如图所示为超声波防碰撞电路&#xff0c;电路采用LM1812并由时基电路Ⅱ来控制LM1812的发送与接收&#xff08;LM1812,即发送又接收&#xff09;。控制距离可用Skfl的电位器来调节&#xff0c;一般可控制2-3m。时基电路1组成单稳态电路&#xff0c;当达到报警距离时&#xff0c;…

python安装MongoDB与运算符优先级

python安装MongoDB MongoDB 是目前最流行的 NoSQL 数据库之一&#xff0c;使用的数据类型 BSON&#xff08;类似 JSON&#xff09;。 PyMongo Python 要连接 MongoDB 需要 MongoDB 驱动&#xff0c;这里我们使用 PyMongo 驱动来连接。 pip 安装 pip 是一个通用的 Python 包…

vue-springboot基于Javaweb的二手儿童绘本网上商城交易系统设计与实现

本二手儿童绘本交易系统是为了提高用户查阅信息的效率和管理人员管理信息的工作效率&#xff0c;可以快速存储大量数据&#xff0c;还有信息检索功能&#xff0c;这大大的满足了用户、商家和管理员这三者的需求。操作简单易懂&#xff0c;合理分析各个模块的功能&#xff0c;尽…

什么是边缘案例测试?如何查找并确定优先级

何为边缘情况&#xff1f; 在极端条件下发生的情况被称为边缘情况&#xff0c;有时候也叫边界情况&#xff0c;在功能、回归、单元和性能测试中都会应用。如果质量保证团队知道某项功能的最大和最小负载&#xff0c;他们就能防止这些情况发生。当用户不按照程序的预期工作流程…

C语言易错知识点十(指针(the final))

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载&#xff0c;请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主&#xff0c;代码兴国&#xff01;❤❤❤ 许久不见&#xff0c;甚是想念&#xff0c;真的是时间时间&#xff0c;你慢些吧&#xff0c;不能再让头发变秃…

EOS运行启动 keosd 和 nodeos

EOS运行启动 keosd 和 nodeos 启动keosd:启动nodeos 安装完eosio后keosd和nodeos是一起带着的&#xff0c;我把EOS的运行keosd 和 nodeos官网教程放上来&#xff1a; https://developers.eos.io/welcome/latest/getting-started-guide/local-development-environment/start-nod…

关于链表的一些问题

求链表的中间节点 可以定义两个指针&#xff0c;一个一次走两步一个一次走一步&#xff0c;当走的快的走到NULL时&#xff0c;走的慢的就是链表的中间节点。&#xff08;此法求出的偶数个节点的链表的中间节点是它中间的第二个&#xff09; 求倒数第K个节点 也可以定义两个指…

9. 进程

9. 进程 1. 进程与程序1.1 main() 函数由谁调用1.2 程序如何结束1.2.1 注册进程终止处理函数 atexit() 1.3 何为进程1.4 进程号 2. 进程的环境变量2.1 应用程序中获取环境变量2.1.1 获取指定环境变量 2.2 添加/删除/修改环境变量2.2.1 putenv()2.2.2 setenv()2.2.3 命令行式添加…

软件测试/测试开发丨Linux进阶命令(curl、jq)

1、 curl 接口请求 curl是一个发起请求数据给服务器的工具curl支持的协议FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSPcurl是一个非交互的工具 2、 curl 发起 get 请求 -G&#xff1a;使用get请求-d&#xf…

上海周边公路骑行路线分享,维乐带你抓住秋天的小尾巴

路线一&#xff1a;松江郊里骑行      在魔都上海&#xff0c;藏着一条自然风景适宜&#xff0c;能眺望黄浦江的美丽骑行路线。导航到华长路杨家角就能到达起点&#xff0c;一路向西&#xff0c;这里路况非常好&#xff0c;只有一条小道&#xff0c;没有汽车的障碍&#xf…

蓝牙物联网灯控设计方案

蓝牙技术是当前应用最广泛的无线通信技术之一&#xff0c;工作在全球通用的 2.4GHZ 的ISM 频段。蓝牙的工作距离约为 100 米&#xff0c;具有一定的穿透性&#xff0c;没有方向限制。具有低成本、抗干扰能力强、传输质量高、低功耗等特点。蓝牙技术组网比较简单&#xff0c;无需…

【Linux--多线程同步与互斥】

目录 一、线程互斥1.1相关概念介绍1.2互斥量mutex1.3互斥量接口1.3.1初始化互斥量1.3.2销毁互斥量1.3.3互斥量加锁1.3.4互斥量解锁1.3.5使用互斥量解决上面分苹果问题 1.4互斥原理 二、可重入与线程安全2.1相关概念2.2常见线程不安全的情况2.3常见不可重入的情况2.4 可重入与线…

Python编程-面向对象基础与入门到实践一书的内容拓展

Python编程-面向对象基础与入门到实践一书的内容拓展 通过编程&#xff0c;模拟现实生活中的事物编程&#xff0c;叫做面向对象编程&#xff0c;此过程也叫做实例化编程 简单类的创建 class Test():def __init__ (self,id):self.id iddef print_id(self):print(self.id)这里建…

数据结构入门到入土——List的介绍

目录 一&#xff0c;什么是List&#xff1f; 二&#xff0c;常见接口介绍 三&#xff0c;List的使用 一&#xff0c;什么是List&#xff1f; 在集合框架中&#xff0c;List是一个接口&#xff0c;继承自Collection。 Collection也是一个接口&#xff0c;该接口中规范了后序容…

【2023年终总结】谈谈一个新人眼里的阿里方法论

写在开头 2023年转眼就过去了&#xff0c;今年我从一名大学生转变某阿里系大厂的“搬砖打工人”&#xff0c;这一转变真的是给我“涉世未深的纯洁心灵”带来了大大的“震撼”。 角色的转变是需要时间进行“内部消化”的。无论是对于个人的价值认知或者是行为方式来说&#xf…

计算机网络【DNS】

DNS 基本概述 与 HTTP、FTP 和 SMTP 一样&#xff0c;DNS 协议也是应用层的协议&#xff0c;DNS 使用客户-服务器模式运行在通信的端系统之间&#xff0c;在通信的端系统之间通过下面的端到端运输协议来传送 DNS 报文。但是 DNS 不是一个直接和用户打交道的应用。DNS 是为因特…

Linux---进程控制

一、进程创建 fork函数 在Linux中fork函数是非常重要的函数&#xff0c;它从已存在进程中创建一个新进程&#xff0c;原进程为父进程 fork函数的功能&#xff1a; 分配新的内存和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程添加子进程到系统的进程列表中fork返…

Redis 快速搭建与使用

文章目录 1. Redis 特性1.1 多种数据类型支持1.2 功能完善1.3 高性能1.4 广泛的编程语言支持1.5 使用简单1.6 活跃性高/版本迭代快1.7 I/O 多路复用模型 2. Redis发展历程3. Redis 安装3.1 源码安装3.1.1 下载源码包3.1.2 解压安装包3.1.3 切换到 Redis 目录3.1.4 编译安装 3.2…

X210 Linux开发板挂载NFS文件系统

软件版本 VirtualBox v7.0、Ubuntu 20.04.3 LTS 网络搭建 采用“路由器”“有线网”来将Linux开发板和Ubuntu虚拟机连接在同一个局域网中。具体接线如下&#xff1a; Linux开发板通过网线直接连接到“路由器”的LAN接口上&#xff0c;然后笔记本电脑通过Wifi与路由器连接。…

模型量化之AWQ和GPTQ

什么是模型量化 模型量化&#xff08;Model Quantization&#xff09;是一种通过减少模型参数表示的位数来降低模型计算和存储开销的技术。一般来说&#xff0c;模型参数在深度学习模型中以浮点数&#xff08;例如32位浮点数&#xff09;的形式存储&#xff0c;而模型量化可以…