Kotlin手记(一):基础大杂烩
Kotlin简介
2011年7月,JetBrains推出Kotlin项目,这是一个面向JVM的新语言
2012年2月,JetBrains以Apache 2许可证开源此项目。
2016年2月15日,Kotlin v1.0发布,这被认为是第一个官方稳定版本。
在Google I/O 2017中,Google宣布在Android上为Kotlin提供最佳支持,取代java成为官方开发语言。
函数和变量
kotlin中的函数和变量可以直接声明在文件中
使用fun
关键字声明函数
使用var
关键字声明变量,可读可写变量
使用val
关键字声明只读变量,不可修改,相当于java中的final
创建对象,只需调用构造器即可,不需要java中的new关键字
fun main(){var age:Int =18
}fun doubleNumber(x:Int):Int{return x*2
}
声明一个数组,使用arrayOf
关键字:
private val studyList = arrayOf("语文","数学","英语")
静态函数
比如工具类中常用的dp2px()
- 直接写在Util.kt文件中
private val displayMetrics = Resources.getSystem().displayMetrics
fun dp2px(dp:Float):Float{return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp,displayMetrics)
}
那么在kotlin中调用的时候直接dp2px(15f)
即可。在java中调用使用Utilkt.dp2px(15f)
,需要在文件名后边加上kt后缀
2. 使用object关键字声明
object Util{private val displayMetrics = Resources.getSystem().displayMetricsfun dp2px(dp:Float):Float{return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp,displayMetrics)}
}
在kotlin中调用Util.dp2px(15f)
,在java中调用Util.INSTANCE.dp2px(15f)
使用object关键字声明,相当于创建了一个类的单例对象
- 使用companion关键字 伴生对象
比如application:
class BaseApplication : Application(){companion object{private lateinit var currentApplication: Contextfun currentApplication():Context{retun currentApplication}}override fun onCreate(){super.onCreate()currentApplication = this}
}
在kotlin中调用BaseApplication.currentApplication()
,然后在java中调用BaseApplication.Companion.currentApplication()
类
依然使用class关键字声明一个类:
class User{var name:String?=null//set,get方法要紧跟成员变量,且里边要使用field关键字//set,get方法默认可以不写set(value){field = value}get(){field}constructor(){}constructor(name: String?){this.name = name}
}
继承和实现接口只需要一个冒号:
,不同的是继承的类需要加上一个括号()
。
class MainActivity:AppcompatActivity(),View.OnClickListener{...
}
但是需要注意的是,如果在类中显式声明了构造器,就不能加上这个括号()
在调用父类的构造器或者本类中其他构造器都要使用:,比如
class MyView : View {constructor(context:Context):this(context,null){}constructor(context:Context, attr:AttributeSet?):super(context,attr){}
}
另外,对一个类成员的set,get方法的访问,可以直接使用.成员变量名的方式:
user.name = "xxxxxx" //进行赋值,相当于调用了setName()方法
如果是在java中去调用,不能使用user.name,只能使用其set,get方法。但是如果使用某一个成员变量,需要在kotlin中声明这个变量的时候,使用@JvmField
注解
@JvmField
var name:String?=null
匿名内部类
创建一个一个匿名内部类,需要object关键字
比如:
call.enqueue(object:Callback){override fun onResponse(call:Call, response:Response){}override fun onFailure(call:Call, e:IOException)
}
另外在内部类中使用外部类的成员变量,在java中为Class.this.xx
,在kotlin中要使用this@Class.xx
静态内部类
- 静态内部类可以直接在一个类中使用class声明一个内部类,这个类可以使用伴生对象
- 如果要使用普通的嵌套内部类,则需要
inner class
去修饰
另外internal
关键字可以去修饰类和方法,表示当前module可见,别的module不可见
接口和抽象类,枚举类
接口(interface xxx)和抽象类(abstract class xxx)的声明,与java中相同
但是枚举类不一样:
class SdutyList{enum class Type{MATH{...}}
}
kotlin中的类默认都是被final关键字修饰的,不能被继承,方法不能被重写,如果想要一个类可以被继承,需要使用abstract
关键字修饰,方法需要使用open
修饰,才可以重写。
判断语句
if 和 when:
if(code in 100..199){} //表示code是否在100到199,双闭区间
另外使用when关键字,相当于java中的switch
when (code){//这里可以支持表达式in 100..199->{}in 200..299->{}else->{}
}
遍历和循环
遍历
除了常规的for遍历一个数组或者集合
//比如有一个`users`的集合
var passUsers = ArrayList<User>()
for(user in users){if(user.age >= 18){passUsers.add(user)}
}
可以使用kotlin提供的操作符去简化上述代码:
//使用forEach操作符
users.forEach({user:User->if(user.age >= 18){passUsers.add(user)}
})
//如果forEach()中接收的参数只是一个lambda表达式,可以将{}提到括号外边,且括号可以省略:
users.forEach{user:User->if(user.age>=18){passUsers.add(user)}
}
//另外,也可以使用类型推断,不用声明user的类型
users.forEach{user->if(user.age>=18){passUsers.add(user)}
}
//最后如果一个lambda表达式,只有一个参数,那么这个参数可以省略不写,而会有一个默认的隐式参数it:User
users.forEach{if(it.age>=18){passUsers.add(it)}
}
还有,这个例子中相当于过滤一些user,只要符合条件的user,那么可以使用filter
操作符来简化:
//这里直接过滤出年龄大于等于18的用户
passUsers.add(users.filter{ it.age >= 18 })
循环
- 使用repeat关键字
//注意这里是一个隐式参数`it:Int`
repeat(100){println(it)
}
- for-i循环
for(i in 0..99){println(i)
}
集合
- 使用库函数
listOf<>()
或者mapOf<>()
- 使用对象
var studyList:List<Lesson> = ArrayList();
var map:Map<Int, String> = HashMap()
但是需要注意的是上面所创建的集合元素都是不可修改的,无法进行增删
所以如果需要元素可变,一般使用:
arrayListOf<>(),mutableListOf<>(),mutableMapOf<>(),hashMapOf<>()
var studyList:ArrayList<Lesson> = new ArrayList()
kotlin中的类系统
Java | Kotlin |
---|---|
Object | Any |
void | Unit |
kotlin中基本数据类型
Kotlin基本数据类型 | 位宽度 |
---|---|
Char | (字符型) |
Boolean | (布尔类型) |
Byte | 8(字节型) |
Short | 16(短整型) |
Int | 32(整型) |
Long | 64(长整型) |
Float | 32(浮点型) |
Double | 64(双精度浮点型) |
变量的可空控制
kotlin中将变量分为可空和不可空两种类型。
//这里的user是一个不可空类型,如果赋值为null,则会报错
var user:User
//这里的user是一个可空类型,需要加一个问号?
var user:User?=null;
那么如果想要调用一个可空类型的变量,有两种方式
user!!.getName() //表示强制调用,不管是否为null
user?.getName() //表示安全调用,如果不为null,才调用
虽然这里可以避免空指针,但是user为null肯定是有问题的,希望在编写代码的时候早发现这些问题。
一个错误的示例:
fun a(name:String){...
}
a(user?.getName()!!)
相关文章:
Kotlin手记(一):基础大杂烩
Kotlin简介 2011年7月,JetBrains推出Kotlin项目,这是一个面向JVM的新语言 2012年2月,JetBrains以Apache 2许可证开源此项目。 2016年2月15日,Kotlin v1.0发布,这被认为是第一个官方稳定版本。 在Google I/O 2017中&am…...

redis源码之:集群创建与节点通信(2)
在上一篇redis源码之:集群创建与节点通信(1)我们可知,在集群中,cluster节点之间,通过meet将对方加入到本方的cluster->nodes列表中,并在后续过程中,不断通过clusterSendPing发送p…...
2024.2.5 寒假训练记录(19)
文章目录 牛客 寒假集训2A Tokitsukaze and Bracelet牛客 寒假集训2B Tokitsukaze and Cats牛客 寒假集训2D Tokitsukaze and Slash Draw牛客 寒假集训2E Tokitsukaze and Eliminate (easy)牛客 寒假集训2F Tokitsukaze and Eliminate (hard)牛客 寒假集训2I Tokitsukaze and S…...

游戏服务器租赁多少钱一台?26元,服不服?
游戏服务器租用多少钱一年?1个月游戏服务器费用多少?阿里云游戏服务器26元1个月、腾讯云游戏服务器32元,游戏服务器配置从4核16G、4核32G、8核32G、16核64G等配置可选,可以选择轻量应用服务器和云服务器,阿腾云atengyu…...
wpf 引入本项目的图片以及引入其他项目的图像资源区别及使用方法
在WPF项目中引入本项目的图片和引入其他项目的图像资源,两者的主要区别在于资源的位置以及如何通过URI引用它们。以下是详细说明及使用方法: 一、引入本项目的图片资源: 将图片文件(如PNG, JPG等)放入你的WPF项目…...
jsp页面,让alert弹出信息换行显示
第一种方式:后端拼接上换行符前端显示 1,java后端将信息封装成字符串时,在需要换行的地方拼接上一个换行符, 显示在HTML中的换行,通常需要用<br>标签替代\n,如下: String javaString &…...

【IC设计】Windows下基于IDEA的Chisel环境安装教程(图文并茂)
Chisel环境安装教程 第一步 安装jdk,配置环境变量第二步 安装sbt,不用配置环境变量第三步 安装idea社区版第四步 离线安装scala的idea插件第五步 配置sbt换源1.切换目录2.创建repositories文件3.配置sbtconfig.txt文件 第六步 使用chisel-tutorial工程运…...

IF=82.9!高分文献解读|吉西他滨联合顺铂化疗激活肿瘤免疫新机制
鼻咽癌(nasopharyngeal carcinoma, NPC)是一种发生于鼻咽部上皮细胞的恶性肿瘤,且高发于中国。吉西他滨联合顺铂(GP)化疗作为鼻咽癌的一种全球标准治疗方案,然而治疗的具体机制目前尚不清楚。中山大学肿瘤防…...
【QT+QGIS跨平台编译】之二十八:【Protobuf+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
文章目录 一、Protobuf介绍二、文件下载三、文件分析四、pro文件4.1 libprotobuf4.2 libprotobuf-lite4.3 libprotoc4.4 protocApp五、编译实践一、Protobuf介绍 Protocol Buffers(简称 Protobuf)是由 Google 开发的一种数据序列化协议,就像 XML 或 JSON 一样,但是它更小、…...
代码解析:list.stream().filter(Objects::nonNull).collect(Collectors.toList())
这段Java代码是使用了Java 8引入的流(Stream) API来处理集合(比如List)。这个特定的例子展示了如何从一个列表中过滤掉所有的null值,并返回一个新的列表,其中不包含任何null元素。下面是对这段代码的逐步解析: 代码解…...

代驾应用系统(ssm)
登录首页 管理员界面 代驾司机界面 普通用户界面 前台页面 1、系统说明 (1) 框架:spring、springmvc、mybatis、mysql、jsp (2) 系统分为前台系统、后端管理系统 2、欢迎留言联系交流学习讨论:qq 97820625…...
技术栈面试综合整理
Git命令详解 设计模式看了又忘,忘了又看 Linux命令 Java集合Map Java基础 JVM面试题 JVM原理最全、清晰、通俗讲解,五天40小时吐血整理_小爷欣欣-CSDN博客_jvm原理 IO 计算机网络 计算机网络2 jsp 多线程 多线程2 大厂 JAVA 高频面试题 Ja…...
Java中的static关键字
静态变量(类变量)、静态方法(类方法):static声明的属性与方法。 静态变量/静态方法生命周期和类相同,在整个程序执行期间都有效。它有如下特点: 为该类的公用变量,属于类࿰…...
SpringBoot日志插件log4J和slf4J的使用和比较含完整示例
点击下载《SpringBoot日志插件log4J和slf4J的使用和比较含完整示例》 1. 前言 本文主要介绍了在 Spring Boot 框架中如何使用 Log4j 和 Slf4j,并通过对比分析它们的优缺点,帮助读者更好地选择合适的日志记录工具。文章中提供了完整的示例代码ÿ…...

我的世界Java版服务器如何搭建并实现与好友远程联机Minecarft教程
文章目录 1. 安装JAVA2. MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7. 配置公网访问地址8.远程联机测试9. 配置固定远程联机端口地址9.1 保留一个固定tcp地址9.2 配置固定公网TCP地址9.3 使用固定公网地址远程联机 本教程主要介…...

如何进行游戏服务器的负载均衡和扩展性设计?
在进行游戏服务器的负载均衡和扩展性设计时,需要考虑多个方面,以确保服务器的稳定性和可扩展性。以下是一些关键的步骤和考虑因素: 负载均衡的需求分析 在进行负载均衡设计之前,需要深入了解游戏服务器的负载特性和需求。这包括…...

机器学习数学基础
机器学习基础 1、标量、向量、矩阵、张量2、概率函数、概率分布、概率密度、分布函数3、向量的线性相关性4、最大似然估计5、正态分布(高斯分布)6、向量的外积(叉积)7、向量的内积(点积)8、超平面(Hyperplane)9、广义线性模型(GLM)10、伯努利分布与二项分布11、凸函数…...

SpringBoot注解--04--01--注解@Mapper在IDEA中自动注入警告的解决方案
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 问题原因 解决方案方法1:为 Autowired 注解设置required false方法2:用 Resource 替换 Autowired方法3:在Mapper接口上加上Repo…...

【Java八股面试系列】JVM-垃圾回收
目录 垃圾回收 堆空间的基本结构 内存分配和回收原则 分代收集机制 Minor GC 流程 空间分配担保 老年代 大对象直接进入老年代 长期存活的对象将进入老年代 GC的区域 对象存活判定算法 引用计数法 可达性分析算法 finalize() 字符串常量判活 类判活 垃圾回收算…...

Elasticsearch:集群故障排除和优化综合指南
Elasticsearch 是一个强大的搜索和分析引擎,是许多数据驱动应用程序和服务的核心。 它实时处理、分析和存储大量数据的能力使其成为当今快节奏的数字世界中不可或缺的工具。 然而,与任何复杂的系统一样,Elasticsearch 可能会遇到影响其性能和…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...