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,一经查实,立即删除!

相关文章

LeetCode第20题 - 有效的括号

题目 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串&#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。 注意空字符串…

面试题: 你是如何做好Unity项目性能优化的

在面试中&#xff0c;我们经常会被问各种”莫名奇妙”的问题, 比如这道:”你是如何做好Unity项目性能优化的?”。“这个问题也太泛了吧&#xff0c;没有具体的优化点,这怎么回答?” 瞬间跃入脑海。做面试复盘的时候&#xff0c;你可能会想这个面试官是不是什么都不懂&#xf…

html表单制作及实例

HTML表单是一种允许用户输入数据的网页元素。表单数据可以通过各种方式发送到服务器进行处理。下面是一个简单的HTML表单的例子&#xff1a; <form action"/submit_form" method"post"><label for"fname">First name:</label>…

【算法专题】递归算法

递归 递归1. 汉诺塔问题2. 合并两个有序链表3. 反转链表4. 两两交换链表中的节点5. Pow(x, n) --- 快速幂 递归 在解决⼀个规模为 n 的问题时&#xff0c;如果满足以下条件&#xff0c;我们可以使用递归来解决&#xff1a; 问题可以被划分为规模更小的子问题&#xff0c;并且…

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项目中…

ARM AArch64的虚拟化(virtualization)详解(下)

目录 六、异常的虚拟化 启用虚拟中断 生成虚拟中断 将中断转发(forward)到vCPU示例

文章解读与仿真程序复现思路——中国电机工程学报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…

[react]react-router-dom 与 redux 版本升级

[react]react-router-dom 与 redux 版本升级 环境脚手架的升级react-router-dom 升级关于路由相关文件的写法--react-router-dom 5.0.1入口渲染文件App.js路由框架src/views/root/index.js路由守卫 src/views/routerguide/index.jsx路由文件src/views/page.js 关于路由相关文件…

Linuxwebserver项目

1.主函数mian signal(SIGPIPE,SIG_IGN); char pwd_path[256]"";记录工作目录 char * path getenv("PWD");获取当前目录工作路径 ///home/itheima/share/bjc34/07day/web-http strcpy(pwd_path,path);字符串复制函数 strcat(pwd_path…

《数据结构、算法与应用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;提升渲染效…

LeetCode 2735. 收集巧克力【枚举】2043

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

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

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

CollectionUtils

使用 CollectionUtils 类的常用方法 在Java开发中&#xff0c;我们经常需要对集合进行各种操作&#xff0c;而Apache Commons Collections库提供了一个方便的工具类 CollectionUtils&#xff0c;其中包含了许多实用的方法。在这篇博客中&#xff0c;我们将深入了解一些常用的方…

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的…