《Kotlin核心编程》笔记:val 和 var 字符串

news2024/11/27 14:50:48
Kotin重要特性:
  • 类型推导:定义变量不再需要显示声明类型,由编译器自动推导出变量的类型 如 val a ="hello” val b = 5   val c = 10L
  • 表达式函数:  fun sum(x: Int, y: Int) = x + y // 省略了{},Kotlin支持这种用单行表达式与等号的语法来定义函数,叫作表达式函数体,作为区分,普通的函数声明则可叫作代码块函数体

val和var的使用规则

如果说var代表了varible(变量),那么val可看成value(值)的缩写。但也有人觉得这样并不直观或准确,而是把val解释成varible+final,即通过val声明的变量具有Java中的final关键字的效果,也就是引用不可变
   
我们可以在IntelliJ IDEA或Android Studio中查看val语法反编译后转化的Java代码,从中可以很清楚地发现它是用 final 实现这一特性的
                 
val的含义:引用不可变 (变量一旦初始化就不能更改指向,但是可以更改变量指向的内容里的值) 因此,val声明的变量是只读变量,它的引用不可更改,但并不代表其引用对象也不可变。事实上,我们依然可以修改引用对象的可变成员。这跟Java中的final对象概念上是一样的。

重要原则:优先使用val来声明变量更好的理解可以是:尽可能采用val、不可变对象及纯函数来设计程序。关于纯函数的概念,其实就是没有作用的函数,具备引用透明性。

           
因为引用不可变,val声明的变量只能被赋值一次,且在声明时不能省略变量类型。
                 
在Kotlin编程中,我们推荐优先使用val来声明⼀个本身不可变的变量,这在大部分情况下更具有优势:
  • 这是⼀种防御性的编码思维模式,更加安全和可靠,因为变量的值永远不会在其他地方被修改(⼀些框架采用反射技术的情况除外);在Java中进行多线程开发时,由于Java的变量默认都是可变的,状态共享使得开发工作很容易出错不可变性则可以在很大程度上避免这⼀点
  • 不可变的变量意味着更加容易推理,越是复杂的业务逻辑,它的优势就越⼤。
既然有了val, 为什么还要使用var?
  • 因为var有更好的性能,占用内存更少。所以,尤其是可能在业务中需要存储大量的数据的数据结构,如集合遍历中使用var来计算结果等,显然采用var是其更加适合的实现方案。
在函数式开发中,我们优先推荐使用val和不可变对象来减少代码中的副作用,提升程序的可靠性和可组合性。在⼀些个别情况下,尤其是强调性能的代码中,用var定义局部变量会更加适合。

编译时常量

val声明的变量只能算是不可变的变量,但并不是一个常量,要定义一个真正意义上的常量,必须使用const, const只能修饰基本类型,且必须初始化
//编译时常量
const val b = 3

这样定义了一个编译时常量,等价于java的 static final int

字符串的定义和操作

 和Java的字符串没什么不同,但是由于String是⼀个字符序列,所以我们可以直接对其进行遍历

 还可以访问这个字符序列的成员:

 此外,Kotlin的字符串还有各种丰富的API,如:

 更多字符串类方法可以查阅Kotlin API⽂档:String - Kotlin Programming Language

定义原生字符串

 简而言之,用这种3个引号定义的字符串,最终的打印格式与在代码中所呈现的格式⼀致,而不会解释转化转义字符(正如上述例子中的\n),以及Unicode的转义字符(如\uXXXX)。比如,我们用字符串来描述一段HTML代码,用普通字符串定义时必须是这样子:

 采用原生字符串的格式,会非常方便。如下:

字符串模板

 此外,除了变量,我们当然也可以通过同样的方式把表达式插入字符串中,并且在${expression}中使用双引号。如:

字符串判等

Kotlin中的判等性主要有两种类型:
  • 结构相等。通过操作符==来判断两个对象的内容是否相等。
  • 引用相等。通过操作符===来判断两个对象的引用是否⼀样,与之 相反的判断操作符是! == 如果比较的是在运行时的原始类型,比如Int,那么===判断的效果也等价于==。

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

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

相关文章

Git——git分支操作

1 什么是分支 在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独 分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时 候,不会影响主线分支的运行。对于初…

ArcGIS基础实验操作100例--实验52导出点要素的坐标值

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验52 导出点要素的坐标值 目录 一、实验背景 二、实验数据 三、实验步骤 (…

flutter:如何实现局部导航管理?

引言 今天,小编给大家分享如何在 flutter 中实现 ‘局部导航’。开始之前我们先来统一一下关于 局部导航 的概念。 局部导航是什么? 我们在 flutter 中使用 navigator 来管理 app 的页面堆栈,主要包括 push、pop 这两种操作。而当我们UI设…

gitee实现项目托管

一、下载git官网链接:Git - Downloads安装参考:https://blog.csdn.net/weixin_44950987/article/details/102619708二、登录gitee(码云),添加SSH公钥2.1、生成SSH公钥过程2.2、打开刚刚下载的git 然后跟着步骤来:2.3、…

C程序设计教程(02)—— 概述部分练习题

C程序设计教程(02)—— 概述部分练习题 一、填空题 1、结构化程序设计采用顺序结构、(分支结构或选择结构)和循环结构等三种基本结构编写程序。 2、程序由(一个或多个函数)组成,其中必须有且…

2.ISAAC 环境配置

ISAAC 环境配置 本文档介绍了如何开始使用 Isaac SDK 和 Isaac Sim 进行开发。 完成本文档中的步骤后,您应该准备好开始使用 Isaac SDK 开发机器人应用程序。 预安装 Isaac 目前仅支持 Ubuntu 18.04 LTS 从您的工作站进行开发和模拟。 请确保在您的工作站上安装最…

机器学习记录

概念辨析: 人工智能包含机器学习,机器学习包含深度学习 机器学习 机器学习约等于:looking for Function 深度学习:Function就是一个类神经网络 如果输出是一个数值就就叫回归 如果输出是几种类别就是分类 自监督学习为机器学习…

逻辑漏洞渗透与攻防(四)之任意账号注册

目录 任意账号注册 未验证邮箱/手机号 批量注册 个人信息伪造 前端验证审核绕过 邮箱/手机号注册激活验证绕过 用户名覆盖 任意账号注册 未验证邮箱/手机号 未验证邮箱/手机号,目前很多应用为了方便用户记录自己的用户名与密码,都可以使用邮箱…

【Spring6核心源码系列】IOC之BeanDefinition的封装

哎呀,又是午夜时分,又是一个失眠的夜晚,和去年一样,记得去年今日,也是睡不着觉,就注册了csdn的账号,开始写东西,csdn真是深夜最好的安魂剂。 Spring都发布了6.0,这不赶紧…

什么是JSP,JSP的运行原理是什么?

在动态Web项目的开发中,经常需要动态生成HTML。内容(如系统中的当前在线人数需要动态生成)。如果使用Servlet实现HTML页面数据的统计,则需要使用大量的输出语句。同时,如果静态内容和动态内容混合在一起,那么也将导致程序非常臃肿…

Bandit算法学习[网站优化]03——Softmax 算法

Bandit算法学习[网站优化]03——Softmax 算法 参考资料 White J. Bandit algorithms for website optimization[M]. " O’Reilly Media, Inc.", 2013.https://github.com/johnmyleswhite/BanditsBook 实验环境:jupyter python 3.7 项目地址&#xff1…

【实践】百度APP Feed流业务架构变迁思考和升级实践

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年11月份热门报告盘点罗振宇2023年跨年演讲PPT原稿吴晓波2022年年终秀演讲PPT原稿《底层逻辑》高清配图‍基于深度学习的个性化推荐系统实时化改造与升级.pdf推荐技术在vi…

图像数字识别、数字分割(OCR识别,毕业设计)

基本图像处理流程 这是我在测试图像处理中使用的原始图像。它有一些眩光点,但是图像相当干净。让我们逐步完成获取此源图像的过程,并尝试将其分解为单个数字。 影像准备 在开始图像处理流程之前,我们决定先调整一些图像属性,然后…

【数据结构】LeetCode升级版的环形链表,复制带随机指针的链表

目录 一、升级版的环形链表 1、题目说明 2、题目解析 二、复制带随机指针的链表 1、题目说明 2、题目解析 一、升级版的环形链表 1、题目说明 题目链接:升级版的环形链表 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环&am…

桌面客户端性能提升,优化使用资源消耗

十二月末,MQTT X 团队发布了 1.9.1-beta.1 版本,这也是 MQTT X 的首个公共测试版。我们希望能够通过测试版本,让更多用户参与到 MQTT X 的测试中来,和我们一起打造一个更加稳定的版本,进而帮助用户轻松使用 MQTT X 完成…

LabVIEW传递接收C/C++DLL指针

LabVIEW传递接收C/CDLL指针传递指针C和C函数通常在其函数原型中接收指针。指针基本上是一个表示内存地址的整数值。要将指向DLL的指针(即值的内存地址)从LabVIEW传递到DLL,必须配置调用库函数节点,以通过引用而不是值传递数据。不…

【Linux】vim文本编辑器的使用

目录 一、为什么要学vim 1.原因 2.简单介绍 3.准备工作 二、vim最小集 1.各模式功能 2.编写代码示例 三、vim指令集 1.命令模式 1.1光标移动 1.2复制(剪切)粘贴 1.3 撤销 1.4 替换 / 删除/大小写切换 2.底行模式 2.1本文件内操作 2.2文件…

KITTI数据集可视化(二):点云多种视图与标注展示的可视化代码解析

如有错误,恳请指出。 文章目录1. 在图像上绘制2d、3d标注框2. 在图像上绘制Lidar投影3. Lidar绘制前视图(FOV)4. Lidar绘制前视图(FOV)3d box5. Lidar绘制鸟瞰图(BEV)6. Lidar绘制鸟瞰图(BEV)2d box7. Lidar绘制全景图(RV)8. Lidar绘制全景图(RV)2d box在对KITTI数据…

立创eda专业版学习笔记(2)(从原理图导入变更失败)

出师不利啊,刚想把用一个原理图生成pcb板就出来这个,第一眼我是有点懵的。后来发现其实是我没搞清楚软件的基本逻辑。 原本,在一个板子的下面有一个原理图,原理图有1页,图标是这个样子 我本来是想新建一个pcb板&#x…

Spring MVC 返回数据

默认请求下⽆论是 Spring MVC 或者是 Spring Boot 返回的是视图(xxx.html),⽽现在都是前后端分离的,后端只需要返回给前端数据即可,这个时候我们就需要使⽤ResponseBody 注解了。 1.返回静态界面 创建前端页面index.…