学习笔记-Kotlin

准备工作

  1. 下载安装kotlin编译器,记录此笔记时的版本是v1.2.10,目前最新发布版本是v2.1.10
  2. 解压下载的安装包,配置环境变量指向bin目录(官方指导).

如果不想在本地安装环境,也可以使用在线编辑器

尝试编写第一个helloWorld

  1. 新建一个名为hello.kt的文件,内容如下:
fun main(args: Array<String>) {
    println("Hello, World!")
}
  1. 执行以下命令将kotlin编译生成jar:
kotlinc hello.kt -include-runtime -d hello.jar

-d 参数用于指定生成的文件名. -include-runtime 参数指定将kotlin运行时需要的依赖库编译进包.

  1. 运行jar
java -jar hello.jar

此时你可以看到命令窗口下出现了熟悉的"helloWorld!"

Hello, World!

开发工具

  • IntelliJ IDEA的Kotlin插件是和语言同步开发的,是可用功能最全的开发环境.InterlliJ IDEA15及以后的版本不需要额外设置,Kotlin插件可以开箱即用.你可以选择免费开源的IntelliJ IDEA Community版,也可以选择IntelliJ IDEA Ultimate版本.在"New Project"对话框中选择"Kotlin",然后就可以开始工作了.(参考材料:官方说明-内有下载链接)

  • 如果你用的是Android Studio,可以从"plug-in manager"(插件管理器)中安装Kotlin插件,打开"setting"(设置)=>“Plugins”(插件)=>“Install JetBrains Plugin”(安装JetBrains插件)=>“Kotlin”,就可以开始工作啦.

  • Eclipse同样可以使用kotlin,Kotlin的Eclipse插件提供了必要的IDE功能,如导航和代码补全.可以通过Eclipse Marketplace中找到,选择"Help"=>“Eclipse Marketplace”,搜索"kotlin"即可.

  • 最简单的方式,就是直接使用在线playground,不需要安装任何环境和配置就可以在线编写编译及运行Kotlin小程序.在线playground

基本语法差异(与java对比)

  • 声明一个函数使用关键字:fun,如上面的helloWorld.
  • 数组就是类,Kotlin没有声明数组类型的特殊语法.如:Array<String>
  • println代替了System.out.println.
  • 代码行结尾不需要;.
  • 参数及类型用:隔开,函数返回类型写在参数列表之后.如:fun max(a:int,b:int):Int{.

变量

定义变量使用关键字+变量名+类型(也可不加).
如:

val question = "The Ultimate Question of Life,the Universe,andEverything"
var answer = 42
var answer: Int //如果没有初始化,要显示指定类型.

如果你不指定类型,编译器会自动分析初始经表达式的值,自动推导出变量类型.

可变变量和不可变变量

  • val:不可变引用,对应java的final. --应尽可能地使用它来场景所有的kotlin变量.

尽管val引用自身是不可变的,但它指向的对象可能是可变的.如:

var languages = arrayListOf("Java")
languages.add("Kotlin")
  • var:可变引用.

字符串模板

先看个例子:

fun main(args:Array<String>){
    val name = if(args.size > 0) args[0] else "Kotlin"
    println("Hello,$name!")
}

以上使用了$字符将变量转义输出,等效于java中的:

"Hello,"+name+"!"

如果需要在字符串中输出*$*字符,需要对它进行转义,如:

println("\$x")

将会输出:

$x

涉及较复杂的表达式时,需要将表达式用{}括起来:

println("Hello,${args[0]}!")

在花括号内,还可以嵌套使用双引号

println("Hello,${if(args.size>0) args[0] else "someone"}!")

类和属性

类中声明只读属性和可写属性使用关键字valvar来区分:

class Person(
    val name : String,// 只读属性,生成一个字段和一个简单的getter
    var isMarried: Boolean //可写属性,生成一个字符,一个getter和一个setter
)

使用属性:

fun main(args: Array<String>) {
    println("Hello, world!")
    val person = Person("lqq",true) //调用构造方法不需要使用new关键字
    println("Hello,"+person.name) //可以直接访问属性,但实际调用的是getter
    println("Hello,${person.name}!")
}

自定义访问器:


fun main(args: Array<String>) {
    val rec = Rectangle(3,3)
    println(rec.isSquare)
}

class Rectangle(val height: Int, val width: Int){
    val isSquare: Boolean
    get(){
        return height == width
    }
    
    //也可以写为:
    //get() = height == width
}

目录和包

  • Kotlin不区分导入的是类还是函数,可以直接导入函数
package geometry.example
import geometry.shaes.createRandomRectangle

fun main(args: Array<String>){
    println(createRandomRectangl().isSquare)
}
  • 包层级结构可以不需要遵循目录层级结构
geometry
|--example.kt <=包geometry.example
|--shapes.kt <=包geometry.shapes

表示和处理选择

枚举

Kotlin中这是极少数比Java使用了更多关键字的例子,使用了enumclass两个关键字:

enum class Color{
    RED,ORANGE,YELLOW,GREEN
}

声明一个带属性的枚举类

enum class Color(
    val r: Int,val g: Int,val b: Int){
    RED(255,0,0),ORANGE(255,165,0),
    YELLOW(255,255,0); //这里必须要有分号,这是Kotlin语法中唯一必须使用分号的地方.

    fun rgb() = (r*256+g)*256+b //给枚举定义一个方法
}

when

使用when来处理枚举类.
与Java不同,不需要为每个分支都写上break语句.

fun getMnemonic(color:Color) =  //直接返回一个when表达式
    when(color){  //如果颜色和枚举常量相等就返回对应字符串
        Color.RED -> "Richard"
        Color.ORANGE -> "OF"
        Color.YELLOW -> "York"
        Color.GREEN -> "Gave"
        Color.BLUE -> "Battle"
        ...
    }

>>> println(geMnemonic(Color.BLUE))
Battle

一个分支上合并多个选项,只需要用,隔开

fun getWarmth(color:Color) = when(color){
    Color.RED,Color.ORANGE ->"warm"
    Color.GREEN -> "neutral"
}

when中使用任意对象

fun mix(c1:Color,c2:Color)=
when(setOf(c1,c2)){
    setOf(RED,YELLOW) -> ORANGE
    setOf(YELLOW,BLUE) -> GREEN
    else -> throw Exception("Dirty color")
}

以上模拟了调色板的方法,当调用参数与分支条件相等时可以得到对应的返回.都不满足时返回返回else分支结果.
以上写法也可以改为不带参数的when(优点:不会创建额外对象,但会更难理解):

fun mix(c1:Color,c2:Color)=
when{
    (c1 == RED  && c2 == YELLOW) || c1 == YELLOW && C2 == RED -> ORANGE
    else -> throw Exception("Dirty color")
}

智能转换

在Java中,需要通过instanceOf来检查一个变量是否属于某个类型,使用时还需要显示的转换,如:

if( e instanceOf Sum){
  Sum s = (Sum)e;
  return s.left;
}

而在kotlin中,通过一次is检查后,即可直接使用(编译器自动执行了类型转换):

if(e is Sum){
    return e.left
}

代码块做为"if"和"when"的分支

ifwhen都可以使用代码块作为分支体.在这种情况下,代码块中的最后一个表达式就是返回的结果.

fun evalWithLoggin(e:Expr):Int = 
    when(e){
    	is Num ->{
    		println("num:${e.value}")
    		e.value //如果e的类型是Num就会返回这个表达式
    	}
    	is Sum ->{
    		val left = evalWithLogging(e.left)
    		val right = evalWithLogging(e.right)
    		left+right //如果e的类型为Sum就会返回这个表达式
    	}
    	else -> throw IllegalArgumentException("Unknown expression")
    }

迭代数字:区间和数列

kotlin中可以使用..来表示区间

//闭区间
for(i in 1..100){
	println(i)
}

//补充:开区间
for(i in 0 until 10){
	println(i)
}

倒序迭代:

for(i in 100 downTo 1 step 2){
	println(i)
}

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

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

相关文章

Pycharm连接远程解释器

这里写目录标题 0 前言1 给项目添加解释器2 通过SSH连接3 找到远程服务器的torch环境所对应的python路径&#xff0c;并设置同步映射&#xff08;1&#xff09;配置服务器的系统环境&#xff08;2&#xff09;配置服务器的conda环境 4 进入到程序入口&#xff08;main.py&#…

初学stm32 --- II2C_AT24C02,向EEPROM中读写数据

目录 IIC总线协议介绍 IIC总线结构图 IIC协议时序 1. ACK&#xff08;Acknowledge&#xff09; 2. NACK&#xff08;Not Acknowledge&#xff09; IO口模拟II2C协议 发送起始信号&#xff1a; 发送停止信号&#xff1a; 检测应答信号&#xff1a; 发送应答信号&#x…

Excel 技巧07 - 如何计算到两个日期之间的工作日数?(★)如何排除节假日计算两个日期之间的工作日数?

本文讲了如何在Excel中计算两个日期之间的工作日数&#xff0c;以及如何排除节假日计算两个日期之间的工作日数。 1&#xff0c;如何计算到两个日期之间的工作日数&#xff1f; 其实就是利用 NETWORKDAYS.INTL 函数 - weekend: 1 - 星期六&#xff0c;星期日 2&#xff0c;如…

保姆级图文详解:Linux和Docker常用终端命令

文章目录 前言1、Docker 常用命令1.1、镜像管理1.2、容器管理1.3、网络管理1.4、数据卷管理1.5、监控和性能管理 2、Linux 常用命令分类2.1、文件和目录管理2.2、用户管理2.3、系统监控和性能2.4、软件包管理2.5、网络管理 前言 亲爱的家人们&#xff0c;技术图文创作很不容易…

从玩具到工业控制--51单片机的跨界传奇【2】

咱们在上一篇博客里面讲解了什么是单片机《单片机入门》&#xff0c;让大家对单片机有了初步的了解。我们今天继续讲解一些有关单片机的知识&#xff0c;顺便也讲解一下我们单片机用到的C语言知识。如果你对C语言还不太了解的话&#xff0c;可以看看博主的C语言专栏哟&#xff…

智能物流升级利器——SAIL-RK3576核心板AI边缘计算网关设计方案(一)

近年来&#xff0c;随着物流行业智能化和自动化水平不断提升&#xff0c;数据的实时处理与智能决策成为推动物流运输、仓储管理和配送优化的重要手段。传统的集中式云平台虽然具备强大计算能力&#xff0c;但高延迟和带宽限制往往制约了物流现场的即时响应。为此&#xff0c;我…

HTML拖拽功能(纯html5+JS实现)

1、HTML拖拽--单元行拖动 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><…

Jaeger UI使用、采集应用API排除特定路径

Jaeger使用 注&#xff1a; Jaeger服务端版本为&#xff1a;jaegertracing/all-in-one-1.6.0 OpenTracing版本为&#xff1a;0.33.0&#xff0c;最后一个版本&#xff0c;停留在May 06, 2019。最好升级到OpenTelemetry。 Jaeger客户端版本为&#xff1a;jaeger-client-1.3.2。…

【MySQL】简单解析一条SQL查询语句的执行过程

1. MySQL 的逻辑架构图 MySQL 架构主要分为 Server 层和存储引擎层。Server 层集成了连接器、查询缓存、分析器、优化器和执行器等核心组件&#xff0c;负责提供诸如日期、时间、数学和加密等内置函数&#xff0c;以及实现存储过程、触发器、视图等跨存储引擎的功能。存储引擎层…

如何将json字符串格式化

文章目录 如何对json字符串进行格式化显示hutool方案的示例和不足使用fastjson的方案 如何对json字符串进行格式化显示 将json字符串内容进行格式化的输出显示。本文介绍 hutool的方案和alibaba 的fastjson方案 hutool方案的示例和不足 引入依赖 <dependency><grou…

复杂 C++ 项目堆栈保留以及 eBPF 性能分析

在构建和维护复杂的 C 项目时&#xff0c;性能优化和内存管理是至关重要的。当我们面对性能瓶颈或内存泄露时&#xff0c;可以使用eBPF&#xff08;Extended Berkeley Packet Filter&#xff09;和 BCC&#xff08;BPF Compiler Collection&#xff09;工具来分析。如我们在Red…

unity学习18:unity里的 Debug.Log相关

目录 1 unity里的 Debug.log相关 2 用Debug.DrawLine 和 Debug.DrawRay画线 2.1 画线 1 unity里的 Debug.log相关 除了常用的 Debug.Log&#xff0c;还有另外2个 Debug.Log("Debug.Log"); Debug.LogWarning("Debug.LogWarning"); Debug.LogErro…

IoTDB 常见问题 QA 第三期

关于 IoTDB 的 Q & A IoTDB Q&A 第三期持续更新&#xff01;我们将定期汇总我们将定期汇总社区讨论频繁的问题&#xff0c;并展开进行详细回答&#xff0c;通过积累常见问题“小百科”&#xff0c;方便大家使用 IoTDB。 Q1&#xff1a;查询最新值 & null 数据相加方…

MySQL数据库(SQL分类)

SQL分类 分类全称解释DDLData Definition Language数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库&#xff0c;表&#xff0c;字段&#xff09;DMLData Manipulation Language数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQLData Query Languag…

Swift 趣味开发:查找拼音首字母全部相同的 4 字成语(上)

概述 Swift 语言是一门现代化、安全、强大且还算性感的语言。在去年 WWDC 24 中苹果正式推出了秃头码农们期待许久的 Swift 6.0&#xff0c;它进一步完善了 Swift 语言的语法和语义&#xff0c;并再接再厉——强化了现代化并发模型的安全性和灵活性。 这里我们不妨用 Swift 来…

C++ STL之容器介绍(vector、list、set、map)

1 STL基本概念 C有两大思想&#xff0c;面向对象和泛型编程。泛型编程指编写代码时不必指定具体的数据类型&#xff0c;而是使用模板来代替实际类型&#xff0c;这样编写的函数或类可以在之后应用于各种数据类型。而STL就是C泛型编程的一个杰出例子。STL&#xff08;Standard …

VUE3 + Ant Design Vue4 开发笔记

异常记录 [Vue warn]: Extraneous non-props attributes (options) were passed to component but could not be automatically inherited because component renders fragment or text root nodes 定位原因解决方法 错误的中文释义&#xff1a;[Vue 警告]&#xff1a;传递给…

QT跨平台应用程序开发框架(2)—— 初识QT

目录 一&#xff0c;创建helloworld 1.1 通过图形化 1.2 通过代码 1.3 通过编辑框 1.4 使用按钮 二&#xff0c;对象树 2.1 关于对象树 2.2 演示释放流程 三&#xff0c;乱码问题 3.1 为什么会有乱码问题 3.2 解决乱码问题 四&#xff0c;认识Qt坐标系 五&#xf…

【搭建JavaEE】(3)前后端交互,请求响应机制,JDBC数据库连接

前后端交互 Apache Tomat B/S目前主流。 tomat包含2部分&#xff1a; apache容器 再认识servlet 抽象出的开发模式 项目创建配置 maven javaeetomcat 忽略一些不用的文件 webapp文件夹 HiServlet 这里面出现了webinfo&#xff0c;这个别删因为这个呢&#xff0c;是这这个这…

美摄科技PC端视频编辑解决方案,为企业打造专属的高效创作平台

在当今这个信息爆炸的时代&#xff0c;视频已成为不可或缺的重要内容形式&#xff0c;美摄科技推出了PC端视频编辑解决方案的私有化部署服务&#xff0c;旨在为企业提供一款量身定制的高效创作平台。 一、全面功能&#xff0c;满足企业多样化需求 美摄科技的PC端视频编辑解决…