Kotlin手记(一):基础大杂烩

news/2024/2/28 16:21:20

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()

  1. 直接写在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关键字声明,相当于创建了一个类的单例对象

  1. 使用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

静态内部类

  1. 静态内部类可以直接在一个类中使用class声明一个内部类,这个类可以使用伴生对象
  2. 如果要使用普通的嵌套内部类,则需要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 })

循环

  1. 使用repeat关键字
//注意这里是一个隐式参数`it:Int`
repeat(100){println(it)
}
  1. for-i循环
for(i in 0..99){println(i)
}

集合

  1. 使用库函数listOf<>()或者mapOf<>()
  2. 使用对象
var studyList:List<Lesson> = ArrayList();
var map:Map<Int, String> = HashMap()

但是需要注意的是上面所创建的集合元素都是不可修改的,无法进行增删

所以如果需要元素可变,一般使用:

  • arrayListOf<>(),mutableListOf<>(),mutableMapOf<>(),hashMapOf<>()
  • var studyList:ArrayList<Lesson> = new ArrayList()

kotlin中的类系统

JavaKotlin
ObjectAny
voidUnit

kotlin中基本数据类型

Kotlin基本数据类型位宽度
Char(字符型)
Boolean(布尔类型)
Byte8(字节型)
Short16(短整型)
Int32(整型)
Long64(长整型)
Float32(浮点型)
Double64(双精度浮点型)

变量的可空控制

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()!!)

http://www.ppmy.cn/news/1350414.html

相关文章

CSP-动态规划-最长公共子序列(LCS)

一、动态规划 动态规划&#xff08;Dynamic Programming&#xff0c;简称DP&#xff09;主要用于求解可以被分解为相似子问题的复杂问题&#xff0c;特别是在优化问题上表现出色&#xff0c;如最短路径、最大子数组和、编辑距离等。动态规划的核心思想是将原问题分解为较小的子…

【蓝桥杯选拔赛真题34】C++最大值 第十三届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析

目录 C/C最大值 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C/C最大值 第十三届蓝桥杯青少年创意编程大赛C选拔赛真题 一、题目要求 1、编程实现&#xff08;C&#xff09; 给定一个…

【GameFramework框架内置模块】1、全局配置(Config)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a; https://blog.csdn.net/q7…

第9讲用户信息修改实现

用户信息修改实现 后端修改用户昵称&#xff1a; /*** 更新用户昵称* param wxUserInfo* param token* return*/ RequestMapping("/updateNickName") public R updateNickName(RequestBody WxUserInfo wxUserInfo,RequestHeader String token){if(StringUtil.isNot…

vue3学习——集成sass

安装 pnpm i sass sass-loader -D在vite.config.ts文件配置: export default defineConfig({css: {preprocessorOptions: {scss: {javascriptEnabled: true,additionalData: import "./src/styles/variable.scss";,},},},} }创建三个文件 src/styles/index.scss //…

openkylin(Debian系)安装nginx及安装前需要的准备

前言 现在很多linux系统都可以使用高级包管理工具安装软件了&#xff0c;但是在像是 openkylin这些新系统中&#xff0c;好多软件包虽然有&#xff0c;但是因为其依赖的包还没有做好&#xff0c;所 以安装会提示你一大堆依赖错误。所以还是要自己来编译安装咯。安装前准备&…

【QT+QGIS跨平台编译】之三十六:【RasterLite2+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、RasterLite2介绍二、文件下载三、文件分析四、pro文件五、编译实践一、RasterLite2介绍 RasterLite2是一个开源的轻量级栅格数据库,可以用于存储和管理各种类型的栅格数据,包括卫星遥感图像、数字高程模型等。 与传统的GIS数据存储方式不同,RasterLite2采用基…

[ubuntu]split命令分割文件

split 命令 $ split --help Usage: split [OPTION]... [INPUT [PREFIX]] Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default size is 1000 lines, and default PREFIX is x. With no INPUT, or when INPUT is -, read standard input.Mandatory argume…

Java集合补充

List和array的转换 Object[] arraylist.toArray(); Integer[] array list.toArray(new Integer[3]); 注意&#xff0c;这里的3是指创建array的大小&#xff0c;当数组小的话&#xff0c;会自动扩容为刚好的大小&#xff0c;若是大了&#xff0c;剩下的空间会变为null。可以使…

STM32自学☞PWM驱动舵机(按键控制)

PWM.c文件 #include "stm32f10x.h" /*初始化函数*/ void PWM_Init(void){ /*开启时钟*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟 /*GPIO初始化*/ G…

Redis的删除策略

在Redis中的数据删除策略有三种&#xff1a;定时删除、惰性删除、定期删除 定时删除 当key设置有过期时间&#xff0c;且过期时间到达时&#xff0c;立即执行key的删除操作 优点&#xff1a;节约内存&#xff0c;到时就删除&#xff0c;立即释放不必要的内存占用 缺点&#xf…

「数据结构」线性表

定义和基本操作 定义&#xff1a;相同数据类型的 n ( n ≥ 0 ) n(n \ge 0) n(n≥0)个数据元素的有限序列&#xff0c;其中n为表长&#xff0c;当n0时线性表是一个空表一般表示&#xff1a; L ( a 1 , a 2 , … … , a i , a i 1 , a n ) L(a_1,a_2,……,a_i,a_{i1},a_n) L(a…

django实现外键

一&#xff1a;介绍 在Django中&#xff0c;外键是通过在模型字段中使用ForeignKey来实现的。ForeignKey字段用于表示一个模型与另一个模型之间的多对一关系。这通常用于关联主键字段&#xff0c;以便在一个模型中引用另一个模型的相关记录。 下面是一个简单的例子&#xff0…

CentOS 7.9安装Tesla M4驱动、CUDA和cuDNN

正文共&#xff1a;1333 字 21 图&#xff0c;预估阅读时间&#xff1a;2 分钟 上次我们在Windows上尝试用Tesla M4配置深度学习环境&#xff08;TensorFlow识别GPU难道就这么难吗&#xff1f;还是我的GPU有问题&#xff1f;&#xff09;&#xff0c;但是失败了。考虑到Windows…

​​​​​​​C#系列-C#EF框架的优缺点+针对大数据处理的优化(19)

C#EF框架的优缺点 C# EF&#xff08;Entity Framework&#xff09;框架的优缺点如下&#xff1a; 优点&#xff1a; 简单易用&#xff1a;EF框架提供了丰富的API和工具&#xff0c;使得开发者可以轻松地实现数据库的增删改查等操作&#xff0c;无需编写繁琐的SQL语句。对象化…

【Jenkins】Jenkins关闭Jenkins关闭、重启

目录 一、Jenkins关闭、重启 二、Jenkins服务的启动、停止方法。 一、Jenkins关闭、重启 1.关闭Jenkins 只需要在访问jenkins服务器的网址url地址后加上exit&#xff0c;关闭Jenkins服务。 例如&#xff1a;http://localhost:8081/exit 2.重启Jenkies 只有在Jenkins服务启动…

图像处理入门:OpenCV的基础用法解析

图像处理入门&#xff1a;OpenCV的基础用法解析 引言OpenCV的初步了解深入理解OpenCV&#xff1a;计算机视觉的开源解决方案什么是OpenCV&#xff1f;OpenCV的主要功能1. 图像处理2. 图像分析3. 结构分析和形状描述4. 动态分析5. 三维重建6. 机器学习7. 目标检测 OpenCV的应用场…

政安晨:在Jupyter中【示例演绎】Matplotlib的官方指南(二){Image tutorial}·{Python语言}

咱们接着上一篇&#xff0c;这次咱们讲使用Matplotlib绘制图像的简短尝试。 我的这个系列的上一篇文章在这里&#xff1a; 政安晨&#xff1a;在Jupyter中【示例演绎】Matplotlib的官方指南&#xff08;一&#xff09;{Pyplot tutorial}https://blog.csdn.net/snowdenkeke/ar…

ctfshow-文件上传(web151-web161)

目录 web151 web152 web153 web154 web155 web156 web157 web158 web159 web160 web161 web151 提示前台验证不可靠 那限制条件估计就是在前端设置的 上传php小马后 弹出了窗口说不支持的格式 查看源码 这一条很关键 这种不懂直接ai搜 意思就是限制了上传类型 允许…
最新文章