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{ //参数和返回值类型都为Intreturn 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类型自动推断变量类型为Intval 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) 排除了 8print(i)
}
println("\n----------------")

 对应输出为:

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

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

相关文章

OFDM——PAPR减小

文章目录 前言一、PAPR 减小二、MATLAB 仿真1、OFDM 信号的 CCDF①、MATLAB 源码②、仿真结果 2、单载波基带/通频带信号的 PAPR①、MATLAB 源码②、仿真结果 3、时域 OFDM 信号和幅度分布①、MATLAB 源码②、仿真结果 4、Chu 序列和 IEEE802.16e 前导的 PAPR①、MATLAB 源码②…

微服务(1)

目录 1.什么是微服务&#xff1f;谈谈你对微服务的理解&#xff1f; 2.什么是Spring Cloud&#xff1f; 3.Springcloud中的组件有哪些&#xff1f; 3.具体说说SpringCloud主要项目&#xff1f; 5.SpringCloud项目部署架构&#xff1f; 1.什么是微服务&#xff1f;谈谈你对微…

java maven项目添加oracle jdbc的依赖

一般添加依赖是直接在pom.xml中添加配置即可&#xff0c;Maven会自动获取对应的jar包&#xff0c;但是oracle驱动依赖添加后会显示红色&#xff0c;代表找不到依赖项&#xff0c;是因为Oracle授权问题&#xff0c;Maven3不提供Oracle JDBC driver&#xff0c;为了在Maven项目中…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《兼顾捕碳强度与可再生能源消纳的储能容量配置优化方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主的专栏栏目《论文与完整程序》 这个标题涉及到两个主要方面&#xff1a;捕碳强度和可再生能源的消纳&#xff0c;以及与之相关的储能容量配置的优化方法。下面我会逐一解读这两个方面&…

【快速全面掌握 WAMPServer】10.HTTP2.0时代,让 WampServer 开启 SSL 吧!

网管小贾 / sysadm.cc 如今的互联网就是个看脸的时代&#xff0c;颜值似乎成了一切&#xff01; 不信&#xff1f;看看那些直播带货的就知道了&#xff0c;颜值与出货量绝对成正比&#xff01; 而相对于 HTTP 来说&#xff0c;HTTPS 绝对算得上是高颜值的帅哥&#xff0c;即安…

深入理解Mysql事务隔离级别与锁机制

1. 概述 我们的数据库一般都会并发执行多个事务&#xff0c;多个事务可能会并发的对相同的一批数据进行增删改查操作&#xff0c;可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。 这些问题的本质都是数据库的多事务并发问题&#xff0c;为了解决多事务并发问题&am…

Decorator装饰模式(单一责任)

Decorator&#xff08;装饰模式&#xff1a;单一责任模式&#xff09; 链接&#xff1a;装饰模式实例代码 解析 目的 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”&#xff0c;由于继承为类型引入的静态特质&#xff0c;使得这种扩展方式缺乏灵活性&#xff…

《数据结构、算法与应用C++语言描述》- 平衡搜索树 -全网唯一完整详细实现插入和删除操作的模板类

平衡搜索树 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_34Balanced search tree 概述 本章会讲AVL、红-黑树、分裂树、B-树。 平衡搜索树的应用&#xff1f; AVL 和红-黑树和分裂树适合内部存储的应用。 B-树适合外部存储的…

[Ray Tracing: The Rest of Your Life] 笔记

前言 开年第一篇博客~ 整理了三四个小时才整理完orz。 这一部分是光线追踪三部曲的最后一部&#xff0c;主要介绍了蒙特卡洛积分、重要性采样等内容。场景上没有什么大的改变&#xff0c;基本上就是在Cornell Box中渲染的&#xff0c;本篇主要在加速收敛&#xff0c;提升渲染效…

【快速全面掌握 WAMPServer】09.如何在 WAMPServer 中安装 Composer

网管小贾 / sysadm.cc WAMPServer 的大名想必应该有不少人特别是新手小白们略有耳闻吧。 它是出自法国大神之手的一款 PHP 开发环境集成包&#xff0c;工作于 Windows 环境&#xff0c;类似于它这样的集成包在 Linux 平台上反正我是没找到&#xff0c;所以它应该算是对使用 Wi…

MIT线性代数笔记-第35讲-期末复习

目录 35.期末复习打赏 35.期末复习 已知一个矩阵 A A A满足 A x ⃗ [ 1 0 0 ] A \vec{x} \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix} Ax ​100​ ​无解且 A x ⃗ [ 0 1 0 ] A \vec{x} \begin{bmatrix} 0 \\ 1 \\ 0 \end{bmatrix} Ax ​010​ ​仅有一个解 (1)求 A A A的…

linux安装rabbitmq

文章目录 前言一、下载安装包二、erlang1.安装依赖2.解压3.安装4.环境变量5.验证 三、rabbitmq1.安装依赖2.解压3.新建目录4.rabbitmq.env.conf5.rabbitmq.conf6.环境变量7.启动8.验证9.停止 四、安装web1.安装插件2.访问控制台界面 五、开机启动1.编写脚本2.设置开机启动3.测试…

硬件安全模块 (HSM)、硬件安全引擎 (HSE) 和安全硬件扩展 (SHE)的区别

术语 硬件安全模块 (HSM) &#xff1a;Hardware Security Modules硬件安全引擎 (HSE) &#xff1a;Hardware Security Engines安全硬件扩展 (SHE) &#xff1a; Secure Hardware Extensions 介绍 在汽车行业中&#xff0c;硬件安全模块 (HSM)、硬件安全引擎 (HSE) 和安全硬件…

Android长按图标展示快捷方式

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {new Thread(() -> {// 获取ShortcutManager实例ShortcutManager shortcutManager getSystemService(ShortcutManager.class);// 创建要添加的快捷方式ShortcutInfo.Builder shortcutBuilder new ShortcutInfo.Bui…

[蓝桥杯2020国赛]答疑

答疑 题目描述 有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。 老师可以安排答疑的顺序&#xff0c;同学们要依次进入老师办公室答疑。 一位同学答疑的过程如下&#xff1a; 首先进入办公室&#xff0c;编号为 i 的同学需要 si​ 毫秒的时间。然后同学问…

python脚本实现一次提取多个文件下的图片

problem formulation 有时候下载的数据集如下&#xff0c;就很烦&#xff0c;一个里面就一张图片 code import os import shutil# 定义源目录和目标目录 source_dir ./dataset/data/Detection destination_dir ./dataset/data/img# 确保目标目录存在&#xff0c;如果不存…

css原子化的框架Tailwindcss的使用教程(原始html和vue项目的安装与配置)

安装教程 中文官网教程 原始的HTML里面使用 新建文件夹npm init -y 初始化项目 安装相关依赖 npm install -D tailwindcss postcss-cli autoprefixer初始化两个文件 npx tailwindcss init -p根目录下新建src/style.css tailwind base; tailwind components; tailwind ut…

图神经网络--GNN从入门到精通

图神经网络--GNN从入门到精通 一、图的基本表示和特征工程1.1 什么是图1.2 图的基本表示1.3 图的性质--度&#xff08;degree)1.4 连通图&#xff0c;连通分量1.5有向图连通性1.6图直径1.7度中心性1.7特征中心性&#xff08; Eigenvector Centrality&#xff09;1.8中介中心性 …

CentOS 7 实战指南:目录操作命令详解

写在前面 想要在 CentOS 7 系统下更高效地进行目录操作吗&#xff1f;不要犹豫&#xff0c;在这里我为你准备了一篇精彩的技术文章&#xff01;这篇文章将带您深入了解 CentOS 7 下目录操作相关命令的使用方法。无论您是新手还是有一定经验的用户&#xff0c;这篇文章都将为您…

EasyNTS端口穿透服务新版本发布 0.8.7 增加隧道流量总数记录,可以知晓设备哪个端口耗费流量了

EasyNTS上云平台可通过远程访问内网应用&#xff0c;包含网络桥接、云端运维、视频直播等功能&#xff0c;极大地解决了现场无固定IP、端口不开放、系统权限不开放等问题。平台可提供一站式上云服务&#xff0c;提供直播上云、设备上云、业务上云、运维上云服务&#xff0c;承上…