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

  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.mzph.cn/news/676170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索Spring Validation:优雅实现后端数据验证的艺术

在现代Web应用开发中&#xff0c;数据验证是一项至关重要的任务&#xff0c;确保应用程序接收到的用户输入符合预期规范&#xff0c;不仅能够提高系统的健壮性&#xff0c;也能有效防止潜在的安全漏洞。Spring Framework通过其内置的Spring Validation模块&#xff0c;为我们提…

机器学习系列——(十一)回归

引言 在机器学习领域&#xff0c;回归是一种常见的监督学习任务&#xff0c;它主要用于预测数值型目标变量。回归分析能够通过对输入特征与目标变量之间的关系建模&#xff0c;从而对未知数据做出预测。 概念 回归是机器学习中的一种监督学习方法&#xff0c;用于预测数值型目…

yo!这里是Linux线程保姆级入门介绍

目录 前言 Linux线程基础 线程概念 底层示意图 线程vs进程 Linux线程控制 创建线程 线程ID 线程终止 线程等待 线程分离 Linux线程互斥 背景概念 互斥量mutex 1.相关接口 2.实现原理 可重入vs线程安全 死锁 Linux线程同步 条件变量 生产者消费者模型 基于…

文本格式和二进制格式的区别

聊聊字符集&#xff0c;我个人理解不管是文本数据UTF-8、GBK编码格式还是二进制数据&#xff0c;其实内存存储的永远都是“01”数据。二进制存储就是将内存“01”数据拷贝到磁盘里。文本在内存中也是“01”数据&#xff0c;存储文本数据就是将“01”数据拷贝到磁盘里。所以存储…

MacOS 查AirPods 电量技巧:可实现低电量提醒、自动弹窗

要怎么透过macOS 来查询AirPods 电量呢&#xff1f;当AirPods 和Mac 配对后&#xff0c;有的朋友想通过Mac来查询AirPods有多少电量&#xff0c;这个里有几个技巧&#xff0c;下面我们来介绍一下。 透过Mac 查AirPods 电量技巧 技巧1. 利用状态列上音量功能查询 如要使用此功能…

Linux 命令行的世界 :2.文件系统中跳转

我们需要学习的第一件事&#xff08;除了打字之外&#xff09;是如何在 Linux 文件系统中跳转。在这一章节中&#xff0c;我们将介绍以下命令&#xff1a;pwd 打印出当前工作目录名 cd 更改目录 ls 列出目录内容 Linux以分层目录结构来组织所有文件。这就意味着所有文件…

FastJson、Jackson使用AOP切面进行日志打印异常

FastJson、Jackson使用AOP切面进行日志打印异常 一、概述 1、问题详情 使用FastJson、Jackson进行日志打印时分别包如下错误&#xff1a; 源码&#xff1a; //fastjon log.info("\nRequest Info :{} \n"&#xff0c; JSON.toJSONString(requestInfo)); //jackson …

人力资源智能化管理项目(day04:组织架构)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/humanResourceIntelligentManagementProject 觉得有帮助的同学&#xff0c;可以点心心支持一下哈 树组件应用 <!-- 展示树形结构 --><!-- default-expand-all默认展开所有节点 --><el-tree default-ex…

CTFshow web(命令执行 41-44)

web41 <?php /* # -*- coding: utf-8 -*- # Author: 羽 # Date: 2020-09-05 20:31:22 # Last Modified by: h1xa # Last Modified time: 2020-09-05 22:40:07 # email: 1341963450qq.com # link: https://ctf.show */ if(isset($_POST[c])){ $c $_POST[c]; if(!p…

面试高频知识点:2线程 2.1.6线程之间如何通信

线程之间的通信方式 在Java中&#xff0c;常见的线程之间通信方式包括&#xff1a; 共享内存&#xff1a;通过共享内存区域进行通信&#xff0c;即多个线程共享同一块内存区域。通常需要使用同步机制来保护共享数据的一致性。 消息传递&#xff1a;通过消息传递的方式进行通信…

Intellij Idea的数据库工具 DataGrip

DataGrip DataGrip&#xff1a; IDEA自带&#xff0c;非常好用。智能提示很强大&#xff0c;快捷键跟IDEA自身一致。 如果下载不了 DataGrip&#xff0c;也可以直接用 IDEA 自带的。 常用的快捷键 alt8&#xff1a; 打开数据库Service ctrlshiftF10&#xff1a;打开常用的数…

【C++】类的6个默认成员函数

目录 1. 类的6个默认成员函数 2. 构造函数 3. 析构函数 4. 拷贝构造函数 5. 运算符重载 5.1运算符重载 5.2赋值运算符重载 5.3前置和后置重载 5.4日期类的实现 6. const成员函数 7. 取地址及const取地址操作符重载 1. 类的6个默认成员函数 对于一个空类&#xff0c;编…

PriorityQueue主要方法(Java)

PriorityQueue优先队列 PriorityQueue 是 Java 中的一个基于优先级的队列&#xff0c;它可以实现最小堆或最大堆的功能。在 PriorityQueue 中&#xff0c;每个元素都有一个优先级&#xff0c;根据优先级可以决定出队顺序。 PriorityQueue 的实现基于堆&#xff0c;堆是一种完…

JSDoc 真能取代 TypeScript?

这几个月&#xff0c;想必大家都听到过一个新闻&#xff1a; Svelte 弃用 TypeScript&#xff0c;改用 JSDoc 了。 TypeScript 我们知道&#xff0c;是用来给 JS 加上类型的&#xff0c;可以实现类型提示和编译时的类型检查。 那 JSDoc 能够完成一样的功能么&#xff1f;Svel…

图像处理常用算法—6个算子 !!

目录 前言 1、Sobel 算子 2、Isotropic Sobel 算子 3、Roberts 算子 4、Prewitt 算子 5、Laplacian算子 6、Canny算子 前言 同图像灰度不同&#xff0c;边界处一般会有明显的边缘&#xff0c;利用此特征可以分割图像。 需要说明的是&#xff1a;边缘和物体间的边界并不…

Android应用图标微技巧,8.0系统中应用图标的适配

大家好,2018年的第一篇文章到的稍微有点迟,也是因为在上一个Glide系列结束之后一直还没想到什么好的新题材。 现在已经进入了2018年,Android 8.0系统也逐渐开始普及起来了。三星今年推出的最新旗舰机Galaxy S9已经搭载了Android 8.0系统,紧接着小米、华为、OV等国产手机厂…

一句话总结Docker与K8S的关系

一句话总结&#xff1a;Docker只是容器的一种&#xff0c;它面向的是单体&#xff0c;K8S可以管理多种容器&#xff0c;它面向的是集群&#xff0c;Docker可以作为一种容器方案被K8S管理。下文继续具体介绍。 1、容器的核心概念 介绍这几个核心概念&#xff1a;OCI、CR、Runc、…

C语言指针运算

指针运算 指针加法意味着地址向上移动若干个目标指针减法意味着地址向下移动若干个目标示例&#xff1a; int a 100; int *p &a; // 指针 p 指向整型变量 aint *k1 p 2; // 向上移动 2 个目标&#xff08;2个int型数据&#xff09; int *k2 p - 3; // 向下移动 3 个…

springboot/ssm出租车管理系统车辆调度管理系统Java系统

springboot(ssm出租车管理系统 车辆调度管理系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;springboot&#xff08;可改ssm&#xff09; vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&…

PWM输入输出

PWM&#xff08;Pulse Width Modulation&#xff09;即脉冲宽度调制&#xff0c;在具有惯性的系统中&#xff0c;可以通过对一系列脉冲的宽度进行制&#xff0c;来等效地获得所需要的模拟参量&#xff0c;常应用于电机控速、开关电源等领域。 PWM参数 PWM 中有三个重要参数&…