【Kotlin】官网学习笔记
0、IDEA环境设置:
1、基础语法 BasicSyntax
地址:https://kotlinlang.org/docs/basic-syntax.html
一、方法与变量
可以直接编写main方法执行
fun main() {
println("Hello world!")
}
获取main方法的参数并打印:
fun main(args: Array<String>) {
println(args.contentToString())
}
完整的方法声明:
fun sum(a: Int, b: Int): Int {
return a + b
}
支持模版语法(提取单个变量,或者是一个表达式)嵌入字符串值:
fun printSum(a: Int, b: Int): Unit {
println("sum of $a and $b is ${a + b}")
}
变量声明可以完整声明,也可以类型推断
val a: Int = 1 // immediate assignment
val b = 2 // `Int` type is inferred
二、类和实例
使用class定义一个Kt类:
class Shape
kt类没有构造器,直接声明在类上表示需要实例需要构建参数
class Rectangle(var height: Double, var length: Double) {
var perimeter = (height + length) * 2
}
kt的实例的创建是直接调用类名和参数注入获取:
val rectangle = Rectangle(5.0, 2.0)
println("The perimeter is ${rectangle.perimeter}")
三、循环与分支判断:
if 和 else 通用判断:
fun maxOf(a: Int, b: Int): Int {
if (a > b) {
return a
} else {
return b
}
}
可以简单描述行为, 方法的返回类型根据表达式进行自动推断:
fun maxOf(a: Int, b: Int) = if (a > b) a else b
使用for循环数组的元素:
val items = listOf("apple", "banana", "kiwifruit")
for (item in items) {
println(item)
}
或者循环的是数组的下标,可以通过下标获取元素:
val items = listOf("apple", "banana", "kiwifruit")
for (index in items.indices) {
println("item at $index is ${items[index]}")
}
While循环:
val items = listOf("apple", "banana", "kiwifruit")
var index = 0
while (index < items.size) {
println("item at $index is ${items[index]}")
index++
}
kt使用When表达式来代替switch case语法:
对象可以作为when的入参,提供值或者表达式进行判断,条件成立时执行箭头后的内容
类似else if 执行首个成立的条件后,后续情况不执行
当所有条件都不成立之后走else处理
fun describe(obj: Any): String =
when (obj) {
1 -> "One"
"Hello" -> "Greeting"
is Long -> "Long"
!is String -> "Not a string"
else -> "Unknown"
}
使用in关键字判断是否在一个范围中:
判断变量x 是否在 1 到 变量y + 1这个范围中
val x = 10
val y = 9
if (x in 1..y+1) {
println("fits in range")
}
范围需要声明起始值和结束值,可以使用变量或者表达式:
另外也可以对in进行取反,表示不在这个范围之内
val list = listOf("a", "b", "c") if (-1 !in 0..list.lastIndex) {
println("-1 is out of range")
}
if (list.size !in list.indices) {
println("list size is out of valid list indices range, too")
}
可以设置范围的迭代顺序,或者是调整步进值
for (x in 1..10 step 2) {
print(x)
}
println()
for (x in 9 downTo 0 step 3) {
print(x)
}
四、集合操作:
list集合使用stream语法更简洁
val fruits = listOf("banana", "avocado", "apple", "kiwifruit")
fruits
.filter { it.startsWith("a") }
.sortedBy { it }
.map { it.uppercase() }
.forEach { println(it) }
五、类型检查
使用is关键字对值进行类型匹配判断
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// `obj` is automatically cast to `String` in this branch
return obj.length
} // `obj` is still of type `Any` outside of the type-checked branch
return null
}
2、编码风格 Idioms
地址:https://kotlinlang.org/docs/idioms.html
一、数据模型类的用法:
详细文档:https://kotlinlang.org/docs/data-classes.html
/* 数据模型类的用法 */ data class Customer2(val name: String, val email: String) fun main() {
/* 相同属性的对象,Kt不会重新创建? hashCode值是一样的 */
val customer2 = Customer2("李四", "1791255334@qq.com")
val sameOne = Customer2("李四", "1791255334@qq.com") /* 提供以下默认方法: copy(), hashCode(), equals(), toString(), component() */ /* 默认的转字符串方法 */
val toString = customer2.toString()
println(toString) /* component对应属性值 */
val component1 = customer2.component1()
val component2 = customer2.component2()
println("component1 -> $component1, component2 -> $component2") val copiedCustomer1 = customer2.copy()
val copiedCustomer2 = customer2.copy("王五", "1417274225@qq.com")
val copiedCustomer3 = customer2.copy(name = "赵六")
println("c1 -> ${customer2.hashCode()}, sameOne -> ${sameOne.hashCode()}, isEquals c1 ? ${customer2.equals(copiedCustomer1)}")
println("c2 -> ${copiedCustomer1.hashCode()}, isEquals c1 ? ${customer2.equals(copiedCustomer1)}")
println("c3 -> ${copiedCustomer2.hashCode()}, isEquals c1 ? ${customer2.equals(copiedCustomer2)}")
println("c4 -> ${copiedCustomer3.hashCode()}, isEquals c1 ? ${customer2.equals(copiedCustomer3)}") /* 支持解构语法 */
val (name, email) = copiedCustomer3
println("名称:$name,邮箱:$email")
}
打印结果:
Customer2(name=李四, email=1791255334@qq.com)
component1 -> 李四, component2 -> 1791255334@qq.com
c1 -> 1965046214, sameOne -> 1965046214, isEquals c1 ? true
c2 -> 1965046214, isEquals c1 ? true
c3 -> -1497309957, isEquals c1 ? false
c4 -> 1974389211, isEquals c1 ? false
名称:赵六,邮箱:1791255334@qq.com Process finished with exit code 0
二、方法可设置默认参数
fun main() {
/* 方法参数支持声明默认值,在调用时可以不需要提供参数 */
defaultParamFun()
} fun defaultParamFun(a: Int = 0, b: String = "") {
println("a is $a, b is $b")
}
调用结果:
a is 0, b is hello
三、过滤逻辑与隐式参数
详细文档见:https://kotlinlang.org/docs/java-to-kotlin-collections-guide.html#filter-elements
fun main() { val list = listOf(1, 2, 3, 4, 5, 6)
/* 1、支持lambda编写过滤逻辑 */
val positives1 = list.filter { x -> x > 0 }
/* 2、或者调用隐式参数it编写过滤逻辑 */
val positives2 = list.filter { it > 0 } println("p1 -> $positives1, p2 -> $positives2") /* 3、map类型可以同时对key和value编写过滤逻辑 */
val numbers = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key11" to 11)
val filteredNumbers = numbers.filter { (key, value) -> key.endsWith("1") && value > 10 }
println(filteredNumbers) /* 4、KT支持对元素的类型进行过滤 */
val numbers2 = listOf(null, 1, "two", 3.0, "four")
println("All String elements in upper case:")
/* filterIsInstance指定了泛型的类型后,自动过滤非泛型类型的元素 */
numbers2.filterIsInstance<String>().forEach {
println(it.toUpperCase())
} /* 5、逻辑检验 */
val numbers3 = listOf("one", "two", "three", "four")
println(numbers3.none { it.endsWith("e") })
println(numbers3.any { it.endsWith("e") })
println(numbers3.all { it.endsWith("e") })
}
四、IN关键字判断
fun main() {
/* in 判断 */
val johnEmail = "john@example.com"
val emailsList = listOf("1791255334@qq.com", "1791255331@qq.com", "1791255337@qq.com", johnEmail)
if (johnEmail in emailsList) println("$johnEmail is in emailsList!")
/* 或者取反判断 */
if (johnEmail !in emailsList) println("$johnEmail is not in emailsList!")
}
五、字符串操作:
详细文档:https://kotlinlang.org/docs/java-to-kotlin-idioms-strings.html#concatenate-strings
import kotlin.random.Random fun main() {
val a = 100
/* 1、 改用模版语法实现 */
println("$a: dsada") /* 2、可以对字符串逐个字符遍历 */
val str = "abcd"
for (c in str) println(c) /* 3、模版语法提供了两种用法 [变量引用] $var 和 [表达式引用] ${var} */
println("变量引用式:$a, 表达式引用式:${a + 100}") /* 3.1、对模版语法本身需要展示$字符时使用表达式来占位 */
println("${'$'}_9.99") /* 4、KT允许Java方式的字符拼接,但是要求必须是首个变量类型是字符串 */
val newStr = str + "1334"
/* 不可以 val newStr = 100 + str 这样使用 */
println(newStr) /* 5、支持字符逃逸符号 */
val s = "Hello, world!\n"
println("s -> $s") /* 6、原始字符串编写 */
var text = """
for (c in "foo")
print(c)
"""
println("text -> \n$text") /* 7、原始字符串存在前导留白内容,可以使用trimMargin方法处理, 该方法需要提供留白结束符号标记 */
text = """
|Tell me and I forget.
|Teach me and I remember.
|Involve me and I learn.
|(Benjamin Franklin)
""".trimMargin("|")
println("text -> \n$text") /* 8、调用转大写方法 */
val toUpperCase = str.toUpperCase()
println(toUpperCase) /* 9、KT使用字符构建拼接语法: */
val countDown = buildString {
for (i in 5 downTo 1) {
append(i)
appendln()
}
}
println(countDown) /* 10、将集合元素合并成字符串 */
val numbers = listOf(1, 2, 3, 4, 5, 6)
val invertedOddNumbers = numbers
.filter { it % 2 != 0 }
.joinToString(separator = ";") {"${-it}"}
println(invertedOddNumbers) /* 11、调用isBlank方法判断是否为空串,然后返回一个默认值 */
val name = getName().ifBlank { "John Doe" }
println(name) /* 12、替换字符串,常用于清除目标字符,KT单独提供一个API实现 */
var input = "##place##holder##"
val result = input.removeSurrounding("##")
println(result) /* 13、正则替换出现数值的字符 */
val regex = Regex("""\w*\d+\w*""") // raw string
input = "login: Pokemon5, password: 1q2w3e4r5t"
val replacementResult = regex.replace(input, replacement = "xxx")
println("Initial input: '$input'")
println("Anonymized input: '$replacementResult'") /* 15、KT对点号不需要转义 */
val split = "Sometimes.text.should.be.split".split(".")
println(split) /* 16、字符截取, KT提供了更为简便的API,不通过下标入参,提供指定字符实现 */
val inputs = "What is the answer to the Ultimate Question of Life, the Universe, and Everything? 42"
val answer = inputs.substringAfter("?")
println(answer) val inputs2 = "To be, or not to be, that is the question."
val question = inputs2.substringAfterLast(",")
println(question) /* 17、缩进处理 */
val result2 = """
Kotlin
Java
""".trimIndent()
println(result2) } fun getName(): String =
if (Random.nextBoolean()) "" else "David"
六、设置扩展方法:
fun main() {
/* 扩展方法测试 */
"这是一串字符".testFun()
} /* 可以声明扩展方法 */
fun String.testFun() {
println("测试方法调用! 打印字符本体[$this]")
}
七、创建一个单例对象:
fun main() {
println("instance -> $Resource, name -> ${Resource.name}")
} /* 声明一个单例对象 */
object Resource {
const val name = "Name"
} 打印结果
instance -> Resource@330bedb4, name -> Name
八、创建抽象类的实例:
abstract class MyAbstractClass {
abstract fun doSomething()
abstract fun sleep()
} fun main() {
val myObject = object : MyAbstractClass() {
override fun doSomething() {
// ...
println("todo doSomething")
} override fun sleep() { // ...
println("todo sleep")
}
}
myObject.doSomething()
}
【Kotlin】官网学习笔记的更多相关文章
- React官网学习笔记
欢迎指导与讨论 : ) 前言 本文主要是笔者在React英文官网学习时整理的笔记.由于笔者水平有限,如有错误恳请指出 O(∩_∩)O 一 .Tutoial 篇 1 . React的组件类名的首字母必须 ...
- express官网学习笔记
npm init 创建一个package.json npm install express --save-dev 安装到项目依赖 便于多人开发 路由结构定义 app.METHOD(PATH, HAND ...
- Spring boot 官网学习笔记 - logging
commons-logging和slf4j是java中的日志门面,即它们提供了一套通用的接口,具体的实现可以由开发者自由选择.log4j和logback则是具体的日志实现方案. 比较常用的搭配是com ...
- Spring boot 官网学习笔记 - Spring Boot 属性配置和使用(转)-application.properties
Spring Boot uses a very particular PropertySource order that is designed to allow sensible overridin ...
- Spring boot 官网学习笔记 - Spring DevTools 介绍
想要使用devtools支持,只需使用dependencies将模块依赖关系添加到你的构建中 运行打包的应用程序时,开发人员工具会自动禁用.如果你通过 java -jar或者其他特殊的类加载器进行启动 ...
- Spring boot 官网学习笔记 - Auto-configuration(@SpringBootApplication、@EnableAutoConfiguration、@Configuration)
Spring Boot auto-configuration attempts to automatically configure your Spring application based on ...
- Spring boot 官网学习笔记 - Configuration Class(@import)
推荐使用 Java-based configuration ,也可以使用xml we generally recommend that your primary source be a single ...
- Spring boot 官网学习笔记 - Using Spring Boot without the Parent POM,但是还要使用Parent POM提供的便利
If you do not want to use the spring-boot-starter-parent, you can still keep the benefit of the depe ...
- Spring boot 官网学习笔记 - 开发第一个Spring boot web应用程序(使用mvn执行、使用jar执行)
Creating the POM <?xml version="1.0" encoding="UTF-8"?> <project xmlns= ...
- Spring boot 官网学习笔记 - Spring Boot CLI 入门案例
安装CLI https://repo.spring.io/release/org/springframework/boot/spring-boot-cli/2.1.1.RELEASE/spring-b ...
随机推荐
- 开源一站式敏捷测试管理&极简项目管理 itest(爱测试) 6.6.0 发布 ,新增拖拽生成接口测试断言
itest 简介 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试5合1,又有丰富的统计分析.可按测试包分配测试用例执行,也可建测试迭代 ...
- C#开源实用的工具类库,集成超过1000多种扩展方法
前言 今天大姚给大家分享一个C#开源(MIT License).免费.实用且强大的工具类库,集成超过1000多种扩展方法增强 .NET Framework 和 .NET Core的使用效率:Z.Ext ...
- react类组件
使用ES6语法的class创建的组件(有状态组件) 类名称必须要大写字母开头 类组件要继承React.Component父类,从而可以使用父类中提供的方法或者属性 类组件必须提供 render 方法, ...
- C# .NET 云南农信国密签名(SM2)简要解析
BouncyCastle库(BC库)与云南农信最大的区别是 : BC库 SM2Signer.Init() 方法比云南农信多了最后3行代码: digest.Reset(); z = GetZ(user ...
- 《Android开发卷——程序自动登录》
Android程序的自动登录功能 因为是公司的项目,所以这里不方便说出项目名称,这里就说我在做这个项目中用到的一些功能或者叫技术问题吧. 咱们经常用的Android程序中有一个情况,就是当你第一次注册 ...
- OceanBase 金融项目优化案例
领导让我帮忙支持下其他项目的SQL优化工作,呦西,是收集案例的好时机. 下面SQL都是在不能远程的情况下,按照原SQL的逻辑等价改写完成否发给现场同事验证. 案例一 慢SQL,4.32秒: SELEC ...
- mysql ON DUPLICATE KEY UPDATE 演示
<e>查询:INSERT INTO member_test(mem_no,flag)VALUE('111','1') 错误代码: 1062Duplicate entry '111' for ...
- kooder安装及本地搜索git仓库代码
kooder安装及本地搜索git仓库代码 需求背景:如果需要从Git代码仓库查询某个配置项做批量的更新替换,如果一个一个找不合适且容易遗漏,需要借助第三方工具来模糊查询来实现. 1.下载及文档地址ht ...
- CAEmitterLayer动画的开始和结束
有个需求,要求模仿微信做表情下雨的动画,一开始想用CAEmitterLayer,实现的代码如下: //期望:显示特效五秒后结束特效 UIImage *image = [UIImage imageNam ...
- Centos编译加载toa模块
什么是toa模块 toa模块是为了让后端的realserver能够看到真实的clientip而不是lvs的dip 安装步骤 安装依赖包 yum -y install kernel-devel gcc ...