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 可能会遇到影响其性能和…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
