kotlin快速入门1

在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----------------")

 对应输出为:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Armpro脱壳软件搭建教程附源代码

PHP8.0版本&#xff0c;数据库8.0版本 1.配置注册机文件&#xff0c;打开将arm.zip/res目录下&#xff0c;mt管理器搜索将其全部修改为你自己的域名或者是服务器IP 2.然后建立数据库 数据库账号arm 数据库用户名arm 数据库密码EsZfXY4tD3h2NNA4 3.导入数据库 4.配置Redi…

算法基础之滑雪

滑雪 核心思想&#xff1a;记忆化搜索 状态表示&#xff1a; f[i][j] 表示所有从(i,j) 开始滑的路径的最大值 状态计算&#xff1a; 分成四个方向 f[i][j] max(f[i][j] , f[i][j1] 1) 且h[a][b] (下一个点) 必须严格小于 h[i][j] 才能滑过去 #include<iostream>#…

图像去雾/图像去雨(matlab/python)

图像去雾和图像去雨是计算机视觉领域的两个重要问题&#xff0c;旨在改善被大气条件或降雨影响而模糊或噪声化的图像质量。这两个技术在很多实际应用中具有广泛的价值&#xff0c;包括无人驾驶、安防监控、航空航天等领域。下面将分点介绍图像去雾和图像去雨的相关内容。 1. 图…

紫光展锐5G扬帆出海 | 东南亚成为5G新热土

东南亚是一块充满活力和潜力的市场&#xff0c;这里人口基数大、年轻消费群体占比高&#xff0c;电子市场在过去几年显著增长。 增速“狂飙”的东南亚手游 近年来&#xff0c;东南亚手游下载量逐年增长&#xff0c;2023 年第一季度下载量突破 21 亿次&#xff0c;贡献了全球近…

结构体:枚举

#include<iostream> using namespace std; int main() {enum weekday { mon, tus, wed, thu, fri, sat,sun }; //声明枚举类型 enum weekday day; //定义枚举变量 int a, b, c, d, e, f, g, loop; //定义整型变量 char ch A; //定义字符变量 f thu; //按照题意&a…

轻量封装WebGPU渲染系统示例<55>- 顶点数据更新

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/VertexUpdateTest.ts 当前示例运行效果: ​​​​​​​ 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下: export class VertexUpdateTest {pr…

2023 年四川省职业院校技能大赛(高职组)应用软件系统开发赛项样题

2023 年四川省职业院校技能大赛 &#xff08;高职组&#xff09;应用软件系统开发赛项样题 目录 竞赛说明 二、竞赛内容 三、竞赛成果物提交​编辑 四、文档及组件 五、竞赛注意事项 模块一&#xff1a;系统需求分析 二、任务要求 三、竞赛任务 任务 1&#xff1a;智造双碳—能…

从2023看2024前端发展趋势

前言 流光溯影&#xff0c;纵观2023全年&#xff0c;整个前端业界呈现出百业凋零之状&#xff0c;更不乏有“前端已死”等论调甚嚣尘上。从全局视角看IT行业&#xff0c;除了AI领域的大语言模型爆发外&#xff0c;整体都鲜有特别亮眼及突出的技术展现。故而&#xff0c;作为IT…

啊?这也算事务?!

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

学Python的正确顺序千万别弄反了,到时候后悔就来不及了

学Python的正确顺序&#xff1a;从基础到高级&#xff0c;步步为营 在当今数字化时代&#xff0c;Python已成为最受欢迎的编程语言之一。它不仅广泛应用于数据分析、人工智能和Web开发等领域&#xff0c;还为初学者提供了一个友好且功能强大的平台。然而&#xff0c;学习Python…

2023 全球 AI 大事件盘点

本文来自微信公众号硅星人

python观察图像的幅度谱和相位谱——冈萨雷斯数字图像处理

原理 在图像处理中&#xff0c;当我们对图像进行傅里叶变换&#xff0c;可以得到两个重要的成分&#xff1a;幅度谱和相位谱。这些成分在图像分析和处理中扮演着关键的角色。 傅里叶变换 傅里叶变换是一种将信号从时域&#xff08;或空间域&#xff09;转换到频率域的工具。对…

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…

智能制造 - 你需要了解的 10 个基本要素

智能制造 - 您需要了解的 10 个基本要素 在第四次工业革命 (IoT4) 的动态格局中&#xff0c;智能制造成为生产方式的关键变革。先进技术和创新工艺的融合正在塑造工业领域的新时代。探索智能制造的基本要素以及它们如何共同重新定义制造领域的效率、生产力和敏捷性。 一、数字…

Vue+elementUI引入MessageUI展示问题

VueelementUI引入MessageUI展示问题 1.出现问题的界面 2.解决问题 import "element-plus/theme-chalk/el-message.css";

公共用例库计划--个人版(一)

1、公共用例库计划 1.1、目标 在公司测试管理体系的演变过程中&#xff0c;从禅道过渡到devops再到云效平台&#xff0c;我们已经实现了对bug和用例的有效集中管理。然而&#xff0c;在实际操作中发现&#xff0c;尽管用例管理得到了初步整合&#xff0c;但在面对不同系统和测…

详解信道容量,信道速率,安全速率的区别

目录 一. 信道容量与信道速率 二. 小结 三. 安全速率与物理层安全 3.1 香农物理层安全模型 3.2 安全信道速率 四. 补充安全中断概率&#xff08;Secrecy Outage Probability, SOP&#xff09; 五. 补充安全分集度&#xff08;Secrecy Diversity Order, SDO&#xff09; …

【深度学习】Normalizing flow原理推导+Pytorch实现

1、前言 N o r m a l i z i n g f l o w \boxed{Normalizing \hspace{0.1cm} flow} Normalizingflow​&#xff0c;流模型&#xff0c;一种能够与目前流行的生成模型—— G A N 、 V A E \boxed{\mathbf{GAN、VAE}} GAN、VAE​相媲美的模型。其也是一个生成模型&#xff0c;可是…

【网络安全 | Misc】Ditf 安恒九月赛

正文 binwalk发现rar&#xff1a; 修改后缀&#xff0c;打开需要密码&#xff1a; 修改高度&#xff1a; 得到密码&#xff1a; StRe1izia得到一个流量包&#xff1a; 联系上文搜素png得到&#xff1a; 追踪流&#xff1a; 得到Base64代码&#xff1a; flag{Oz_4nd_Hir0_lov3_F…

算法通关村第十四关—堆能高效解决的经典问题(白银)

堆能高效解决的经典问题 一、在数组中找第K大的元素 LeetCode215 给定整数数组ums和整数k,请返回数组中第k个最大的元素。请注意&#xff0c;你需要找的是数组排序后的第k个最大的元素&#xff0c;而不是第k个不同的元素。 示例1&#xff1a; 输入&#xff1a;[3,2,1,5,6,4]和…