Kotlin 函数和变量(四)

导读大纲

    • 1.1 基本要素: 函数和变量
      • 1.1.1 声明变量以存储数据
      • 1.1.2 将变量标记为只读或可重新赋值
      • 1.1.3 更简单的字符串格式化: 字符串模板

1.1 基本要素: 函数和变量

  1. 本节将向你介绍每个 Kotlin 程序都包含的基本元素: 函数和变量

    • 你将编写自己的第一个 Kotlin 程序,了解 Kotlin 如何让你省略许多类型声明
      1. 以及它如何鼓励你尽可能避免使用可变数据–为什么这是件好事
  2. 承上–函数传送门

1.1.1 声明变量以存储数据

  1. 在所有 Kotlin 程序中,另一个常用的基本构件是变量,它允许你存储数据

    • Kotlin 中的变量声明以一个关键字(val 或 var)开头
      1. 然后是变量的名称
    • 虽然 Kotlin 可以让你省略许多变量声明的类型
      1. 得益于其强大的类型推断功能
    • 但你总是可以在变量名后显式地加上类型
  2. 例如,如果您需要在一个 Kotlin 变量中存储一个最著名的问题及其相应的答案

    • <1> 可以通过指定两个变量 question 和 answer 来实现
      1. 在变量名后显式地写上它们的类型
    • <2> 也可以省略类型声明,使示例更加简洁
      1. 与表达式体函数一样,如果不指定类型
        • 编译器会分析初始化表达式,并将其类型作为变量类型
      2. 这里初始化表达式 42 的类型是 Int,因此变量 answer 的类型也是 Int
    • <3> 如果使用浮点常量,变量的类型就是 Double
// <1>
val question: String = "The Ultimate Question of Life, the Universe, and Everything"
val answer: Int = 42
// =========================== <2>
val question = "The Ultimate Question of Life, the Universe, and Everything"
val answer = 42
val yearsToCompute = 7.5e6
  1. 如果您没有立即初始化变量
    • 而是在稍后才赋值,编译器将无法推断出变量的类型
      1. 在这种情况下,您需要明确指定变量的类型
      2. 否则会报错: Return type for property answer cannot be resolved
        在这里插入图片描述
fun main() {val answer: Intanswer = 42              
}

1.1.2 将变量标记为只读或可重新赋值

  1. 为了控制变量何时可以分配新值,Kotlin提供两个关键字val和var来声明变量

    • val(from value)声明一个只读引用
      1. 用 val 声明的变量只能赋值一次,初始化后,就不能再赋值
        • 相比之下,在 Java 中,这可以通过 final 修饰符来表示
    • var(from variable)声明一个可重新赋值的引用
      1. 您可以将即使在初始化之后,也可以向此类变量添加其他值
        • 这种行为类似于 Java 中的non-final变量
  2. 默认情况下,在 Kotlin 中应尽量使用 val 关键字声明所有变量

    • 只有在必要时才将其改为 var
    • 使用只读引用、不可变对象和无副作用的函数
      1. 可以让你充分利用函数式编程风格带来的好处
  3. 执行定义 val 变量的代码块时,必须对该变量进行一次精确的初始化

    • 不过,只要编译器能确保只执行其中一条初始化语句
      1. 你也可以根据某些条件用不同的值来初始化它
    • 您可能会遇到这样的情况:您要为一个结果变量赋值
      1. 而这个结果变量的内容取决于另一个函数的返回值
    • <1> 编译器很聪明,知道两个可能的赋值中会有一个被执行
      1. 因此您仍然可以使用 val 关键字将 result 指定为只读引用
fun canPerformOperation(): Boolean {return true
}
fun main() {val result: String                     // <1>if (canPerformOperation()) {result = "Success"                 // <1>} else {result = "Can't perform operation" // <1>}
}
  1. 需要注意的是,尽管val引用本身是只读的,一旦赋值就不能更改
    • 它指向的对象可能是可变的
    • <1> 将一个元素添加到一个可变的列表
      1. 而该列表是由一个只读引用定义的,这完全没有问题
fun main() {val languages = mutableListOf("Java") languages.add("Kotlin") 
}
  1. 尽管 var 关键字允许变量改变其值,但其类型是固定
    • 例如,如果你在程序进行到一半时决定答案变量应该存储字符串而不是整数
      1. 那么你就会遇到编译错误
        title
    • 编译器仅通过初始化器推断变量类型,在确定类型时不会考虑后续赋值
    • 如果需要在变量中存储类型不匹配的值
      1. 必须手动将该值转换强制转换为正确的类型

1.1.3 更简单的字符串格式化: 字符串模板

  1. 使用字符串模板来拼接字符串
    • 在代码中, 您通过 readln() 函数(可在任何 Kotlin 文件中使用)
      1. 从标准输入流中读取输入
    • 然后使用 if 表达式声明一个变量名初始化其值
      1. 如果标准输入流存在且不为空,那么 name 就会被赋值为 input
        • 否则, 它的默认值为"Kotlin"
      2. 最后, 在传递给 println 的字符串字面量中使用它
fun main() {val input = readln()val name = if (input.isNotBlank()) input else "Kotlin"println("Hello, $name!")
}
  1. 与许多脚本语言一样,Kotlin 允许在变量名前加上 $ 字符

    • 从而在字符串字面量中引用局部变量, 更紧凑,效率也一样高
      1. 这等同于 Java 的字符串连接(“Hello, " + name +”!")
    • 当然,表达式是经过静态检查的,如果您试图引用一个不存在的变量
      1. 代码将无法编译
    • 注意,对于 JVM 1.8 目标,编译后的代码会创建一个 StringBuilder
      1. 将常量部分和变量值附加到其中
    • 针对 JVM 9 或更高版本的应用程序
      1. 通过 invokedynamic 将字符串连接编译成更高效的动态调用
  2. 如果需要在字符串中包含 $ 字符,可以用反斜杠将其转义

    • <1> 不将 x 解释为变量引用
fun main() {println("\$x")            // <1>
}
  1. Kotlin 中的字符串模板非常强大,因为它们不会限制只能引用单个变量
    • 你也可以在字符串模板提供一个更复杂的表达式
      1. 只需在表达式周围加上大括号即可
    • <1> 使用 ${} 语法在问候语字符串中插入 name.length 属性
fun main() {val name = readln()if (name.isNotBlank()) {println("Hello, ${name.length}-letter person!")  // <1>}// Blank input: (no output)// "Seb" input: Hello, 3-letter person!
}
  1. 现在,你可以在字符串模板中包含任意表达式
    • 而且你已经知道 if 在 Kotlin 中也是一种表达式
      1. 将两者结合起来, 将条件直接包含在字符串模板
    • <1> 在字符串模板中,您仍然可以使用本身包含双引号字符串的表达式
      1. 当表达式被求值时,它会返回字符串"someone"或提供的名称
        • 将其插入到包围的模板
fun main() {val name = readln()println("Hello, ${if (name.isBlank()) "someone" else name}!")  // <1>// Blank input: Hello, someone!// "Seb" input: Hello, Seb!
}

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

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

相关文章

18_Python文件操作

计算机中的文件 文件是存储在计算机上的数据集合&#xff0c;它可以是文本、图片、音频、视频或其他任何类型的数据。 在计算机系统中&#xff0c;文件通常用来长期保存信息。 文本文件&#xff1a;一种以字符编码&#xff08;如ASCII、UTF-8、UTF-16等&#xff09;的形式存储…

高速滑环在摄像领域的应用分析

高速滑环在现代摄像技术中扮演着至关重要的角色。随着摄像设备向高速度、高精度的方向发展&#xff0c;传统的信号传输方式已无法满足需求。高速滑环作为连接旋转部件与固定部件的重要组件&#xff0c;能够有效地传递电信号和数据&#xff0c;为摄像设备的高效运转提供保障。 …

[arcgis插件]在批量出图时,如何把图层属性表以动态表格的形式插入到布局页面

在Arcmap&#xff0c;如何把图层属性表以动态表格的形式插入到布局页面? 众所周知&#xff0c;在属性表的左上角&#xff0c;有个功能是“把表添加到布局”&#xff0c;就可以把属性表以表格的形式添加到布局页面。 但是今天要说的是并不是这个&#xff0c;今天要说的是&…

神经网络(一):神经网络入门

文章目录 一、神经网络1.1神经元结构1.2单层神经网络&#xff1a;单层感知机1.3两层神经网络&#xff1a;多层感知机1.4多层神经网络 二、全连接神经网络2.1基本结构2.2激活函数、前向传播、反向传播、损失函数2.2.1激活函数的意义2.2.2前向传播2.2.3损失函数、反向传播2.2.4梯…

SSCMS 插件示例 一插件创建及插件菜单

SSCMS 插件示例下载 1、工程创建过程,如下图所示。 2、工程路径和工程命名,如下图所示。 bjxingch作者 IPluginCUDR插件名称 3、选择框架,如下图所示。 4、使用NuGet安装 SSCMS和Datory,如下图所示。

【软件工程】状态转换图 其他图形工具

状态转换图 一、定义 二、符号表示 其他图形工具 一、层次方框图 二、Warmer图 三、IPO图 例题 选择题

熟练的Java程序员:掌握核心技能,引领技术潮流

Java&#xff0c;作为一门成熟且广泛应用的编程语言&#xff0c;对于程序员来说&#xff0c;不仅是一种技能&#xff0c;更是一种职业态度的体现。一个熟练的Java程序员&#xff0c;应该具备哪些技术呢&#xff1f;本文将为您揭晓答案。 1. 扎实的Java基础 熟练掌握Java语言的…

《深入理解JAVA虚拟机(第2版)》- 第13章 - 学习笔记【终章】

第13章 线程安全与锁优化 13.1 概述 面向过程的编程思想 将数据和过程独立分开&#xff0c;数据是问题空间中的客体&#xff0c;程序代码是用来处理数据的&#xff0c;这种站在计算机角度来抽象和解决问题的思维方式&#xff0c;称为面向对象的编程思想。 面向对象的编程思想…

想从事大模型?一大波工作岗位等你选!

技术类岗位 您可从事&#xff1a;算法工程师&#xff0c;研发工程师。 管理类岗位 您可从事&#xff1a;AI项目经理、AI产品经理、AI销售、AI解决方案。 01 技术类岗位 算法工程师 大模型算法工程师的职位通常要求求职者具备以下几方面的能力和经验。 通用技能教育背景…

大健康管理系统|健康综合咨询问诊平台设计与实现(源码+数据库+文档)

大健康管理系统目录 目录 健康综合咨询问诊平台设计与实现 一、前言 二、系统功能设计 三、系统实现 5.1用户信息管理 5.2 医生信息管理 5.3科室信息管理 5.1新闻信息管理 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xff1a; 五、核心代码 六、论文…

干货|生成式人工智能大模型备案详细办理资料清单

我以刚通过的大模型备案提交的材料清单给大家详细讲一讲 刚通过的大模型备案材料清单 1、安全评估报告 安全评估报告是大模型备案过程中的一个重要关键部分&#xff0c;它需由专业机构或团队完成&#xff0c;全面评估大模型在语料处理、模型训练、服务提供等环节中的安全性。…

vue3ScrollSeamless滚动如何给子元素添加点击事件:事件委托

页面布局如上截图 下面是方法 function parentClick(e) {if (e.target.tagName A) {router.push({path: /noticeDetails,query: {id: e.target.dataset.eid}});} }使用的时候&#xff0c;可以打印一下方法里面的e&#xff0c;加深理解

基于51单片机的电机控制和角度检测

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用滑动变阻器连接ADC0832数模转换器模拟角度传感器&#xff0c;然后通过LCD1602显示数值&#xff0c;然后按键按下不动&#xff0c;电机正转&#xff0c;松开停止。第二…

红外绝缘子数据集

红外绝缘子数据集&#xff0c;绝缘子旋转框检测 电气工程专业研究可用 电力领域稀有红外图像数据集 红外图像总数5000多张&#xff0c;txt格式&#xff0c;可直接用于yolo训练 红外绝缘子数据集 (Infrared Insulator Dataset, IID) 数据集描述 IID是一个专为电气工程专业研究…

react中解析markdown文本

背景 产品想把从某个地方复制出来的markdown文本&#xff0c;保存下来&#xff0c;并且在前端这边展示的时候&#xff0c;按照对应的格式展示 工具 markedhighlight.jsmarked-highlight 原来的marked版本&#xff0c;是可以直接处理高亮配置&#xff0c;但是后续更新为了轻量…

耦合微带线单元的网络参量和等效电路公式推导

文档下载链接&#xff1a;耦合微带线单元的网络参量和等效电路资源-CSDN文库https://download.csdn.net/download/lu2289504634/89583027笔者水平有限&#xff0c;错误之处欢迎留言&#xff01; 一、耦合微带线奇偶模详细推导过程 二、2,4端口开路 三、2端口短路、3端口开路 四…

Apple Intelligence预计会在iOS 18.1和iOS 18.4之间按此顺序推出

本月早些时候 iOS 18 已公开发布&#xff0c;但首批 Apple Intelligence 功能要等到 10 月份 iOS 18.1 发布后才可以使用。Apple Intelligence 功能将继续在 iOS 18.2 及更高版本中推出&#xff0c;预计路线图如下&#xff0c;出自 Apple 网站和传闻。 Apple Intelligence 需要…

electron-vite使用vue-i18n,ts 检查报错上不存在属性“$t”

问题&#xff1a; electron-vite使用vue-i18n&#xff0c;ts类型检查报错&#xff0c;但实际运行没有问题 解决方案&#xff1a; 1. 在electron-vite渲染端代码src目录下&#xff0c;增加 vue-i18n.d.ts 文件&#xff0c;添加如下内容&#xff1a; /* eslint-disable */ im…

【d47_2】【Java】【力扣】1791.找出星型图的中心节点

思路 直接判断 edges[0][0] edges[0][1] edges[1][0] edges[1][1] 谁重复了 例如&#xff1a; [ [1,2] [2,3] ....],那么中心节点一定是2 代码 class Solution {public int findCenter(int[][] edges) {for (int i0;i<1;i){if (edges[1][0]edges[0][i]) {return edg…

Java/Spring项目的包开头为什么是com?

Java/Spring项目的包开头为什么是com&#xff1f; 下面是一个使用Maven构建的项目初始结构 src/main/java/ --> Java 源代码com.example/ --->为什么这里是com开头resources/ --> 资源文件 (配置、静态文件等)test/java/ --> 测试代码resourc…