Kotlin语言编程技巧集
空语句
Kotlin 语言中的空语句有
- {}
- Unit
when (x) {
1 -> ...
2 -> ...
else -> {}
// else -> Unit
}
When 表达式
使用不带判断条件的 when 表达式来改写多路分支
val v = if (x < y) 1 else if (x == y) 2 else 3
val v = when {
x < y -> 1
x == y -> 2
else -> 3
}
使用带判断条件的 when 表达式来模拟模式匹配
val v = if (x == 1) 1 else if (x == 2) 3 else 5
val v = when (x) {
1 -> 1
2 -> 3
else -> 5
}
?. 与 ?:
// n的值为a,b,c,4当中第一个不是null的数
val n = a ?: b ?: c ?: 4
| a | b | c | n |
|---|---|---|---|
| 1 | / | / | 1 |
| null | 2 | / | 2 |
| null | null | 3 | 3 |
| null | null | null | 4 |
// n的值为a.b.c,条件是a,a.b,a.b.c都不是null。否则n的值为4。
val n = a?.b?.c ?: 4
| a | a.b | a.b.c | n |
|---|---|---|---|
| null | / | / | 4 |
| != null | null | / | 4 |
| != null | != null | null | 4 |
| != null | != null | 3 | 3 |
使用解构声明来声明两个带值的变量
var (a, b) = listOf(1, 2) // a == 1, b == 2
var (a, b) = Pair(1, 2) // a == 1, b == 2
var (a, b) = 1 to 2 // a == 1, b == 2
let
the tldr; on Kotlin’s let, apply, also, with and run functions
// Calls the specified function [block] with `this` value as its argument and returns its result.
public inline fun <T, R> T.let(block: (T) -> R): R = block(this)
调用代码块,代码块中调用方 this 为参数 it,返回代码块的结果。
// using 'let' to convert from one type to another
val answerToUniverse = strBuilder.let {
it.append("Douglas Adams was right after all")
it.append("Life, the Universe and Everything")
42
}
// using 'let' to only print when str is not null
str?.let { print(it) }
apply
// Calls the specified function [block] with `this` value as its receiver and returns `this` value.
public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }
调用代码块,代码块中调用方 this 为隐式调用方 receiver,返回调用方 this。
// old way of building an object
val andre = Person()
andre.name = "andre"
andre.company = "Viacom"
andre.hobby = "losing in ping pong"
// after applying 'apply' (pun very much intended)
val andre = Person().apply {
name = "Andre"
company = "Viacom"
hobby = "losing in ping pong"
}
also
// Calls the specified function [block] with `this` value as its argument and returns `this` value.
public inline fun <T> T.also(block: (T) -> Unit): T { block(this); return this }
调用代码块,代码块中调用方 this 为参数 it,返回调用方 this 。
// transforming data from api with intermediary variable
val rawData = api.getData()
Log.debug(rawData)
rawData.map { /** other stuff */ }
// use 'also' to stay in the method chains
api.getData()
.also { Log.debug(it) }
.map { /** other stuff */ }
with
// Calls the specified function [block] with the given [receiver] as its receiver and returns its result.
public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()
调用代码块,代码块中指定参数为隐式调用方 receiver,返回代码块的结果。
// Every Android Developer ever after Wednesday May 17th 2017
messageBoard.init(“https://url.com”)
messageBoard.login(token)
messageBoard.post("Kotlin’s a way of life bro")
// using 'with' to avoid repetitive references to identifier
with(messageBoard) {
init(“https://url.com”)
login(token)
post(“Kotlin’s a way of life bro")
}
run
// Calls the specified function [block] with `this` value as its receiver and returns its result.
public inline fun <T, R> T.run(block: T.() -> R): R = block()
调用代码块,代码块中调用方 this 为隐式调用方 receiver,返回代码块的结果。
// GoT developers after season 7
aegonTargaryen = jonSnow.run {
makeKingOfTheNorth()
swearsFealtyTo(daenerysTargaryen)
realIdentityRevealed(“Aegon Targaryen”)
}
let, apply, also, with & run
| 代码块/函数 | let | apply | also | with | run |
|---|---|---|---|---|---|
| 参数或调用方 this 为隐式调用方 receiver | ○ | ○ | ○ | ||
| 调用方 this 为参数 it | ○ | ○ | |||
| 返回调用方 this | ○ | ○ | |||
| 返回代码块的结果 | ○ | ○ | ○ |
takeIf / takeUnless
difference between kotlin also, apply, let, use, takeIf and takeUnless in Kotlin
// Returns this value if it satisfies the given predicate or null, if it doesn't.
inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? = if (predicate(this)) this else null
// Returns this value if it does not satisfy the given predicate or null, if it does.
inline fun <T> T.takeUnless(predicate: (T) -> Boolean): T? = if (!predicate(this)) this else null
takeIf:调用方 this 如果符合某个条件则返回调用方 this,否则返回 null。
takeUnless:调用方 this 如果不符合某个条件则返回调用方 this,否则返回 null。
println(myVar.takeIf { it is Person } ?: "Not a person!")
println(myVar.takeUnless { it is Person } ?: "It's a person!")
Kotlin语言编程技巧集的更多相关文章
- 一些有意思的面试题(持续更新) .C语言编程技巧札记
一些有意思的面试题(持续更新) http://blog.csdn.net/wangyuling1234567890/article/details/38565239 C语言编程技巧札记 http:// ...
- C语言编程技巧-signal(信号)[转]
自 http://www.uml.org.cn/c++/200812083.asp 信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用 ...
- 用Kotlin语言重新编写Plaid APP:经验教训(I)
原文标题:Converting Plaid to Kotlin: Lessons learned (Part 1) 原文链接:http://antonioleiva.com/plaid-kotlin- ...
- 15个提高编程技巧的JavaScript工具
原文地址:http://www.imooc.com/wenda/detail/243523 JavaScript脚本库是一个预先用JavaScript语言写好的库,它方便了我们开发基于JavaScri ...
- BASH的保护性编程技巧
BASH的保护性编程技巧 shell常用逻辑判断 -b file 若文件存在且是一个块特殊文件,则为真 -c file 若文件存在且是一个字符特殊文件,则为真 -d file 若文件存在且是一个目 ...
- 安卓开发(2)—— Kotlin语言概述
安卓开发(2)-- Kotlin语言概述 Android的官方文档都优先采用Kotlin语言了,学它来进行Android开发已经是一种大势所趋了. 这里只讲解部分的语法. 如何运行Kotlin代码 这 ...
- 释放Android的函数式能量(I):Kotlin语言的Lambda表达式
原文标题:Unleash functional power on Android (I): Kotlin lambdas 原文链接:http://antonioleiva.com/operator-o ...
- linux 操作系统下c语言编程入门
2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理 ...
- Kotlin 语言高级安卓开发入门
过去一年,使用 Kotlin 来为安卓开发的人越来越多.即使那些现在还没有使用这个语言的开发者,也会对这个语言的精髓产生共鸣,它给现在 Java 开发增加了简单并且强大的范式.Jake Wharton ...
随机推荐
- [UE4]函数和事件的区别
一.函数有返回值,事件无返回值 二.函数调用会等待函数执行结果,事件调用只是触发但不会等待. 三.函数执行在同一个线程,事件执行在不同线程. 四.函数可以用局部变量,事件没有局部变量. 五.因为函数执 ...
- sqlserver in 和 exist 子查询
1 in 子查询 use StudentManageDB go --select StudentName from Students --where StudentId=(select Student ...
- typescript接口扩展、接口的继承
//接口扩展:接口可以继承接口 // interface Animal{ // eat():void; // } // interface Person extends Animal{ // work ...
- sas基础系列(3)-表格标颜色示例
以下代码可以直接在SAS执行查看效果 ods path reset;ods path show;ods html close;options nodate;ods pdf file="Pro ...
- crm 2016 tabstatechange event
1 tabstatechange事件在窗体中定义 2 问题是如果选项卡默认为折叠的.且选项卡中包含了iFrame网页. 3 在网页内容加载完成之后,点击选项卡 折叠/展开 按钮, iFrame网页没有 ...
- Submline Text 3插件sublimeTmpl添加新模板
1.安装 一般安装Package Control 2.插件 添加模板 1).进入Preferences->Browse Packages->SublimeTmpl->template ...
- IIS7.5和IIS8如何设置FTP的pasv端口范围
如果不设置端口范围,在防火墙开启的情况下,连接FTP时可能出现列表错误的现象,下面介绍下如何设置FTP的pasv端口范围.. 一.首先打开IIS选择服务器会进入全局设置,再双击FTP防火墙支持 二.设 ...
- HTTP请求返回值所代表的含义
一些常见的状态码为: 200 - 服务器成功返回网页(表示请求成功) 404 - 请求的网页不存在(可能是网络的问题,也可能是网页没办法访问不代表网页不存在) 503 - 服务器超时(服务器故障) 下 ...
- JVM总结-Java 虚拟机是怎么识别目标方法(上)
重载与重写 在 Java 程序里,如果同一个类中出现多个名字相同,并且参数类型相同的方法,那么它无法通过编译.也就是说,在正常情况下,如果我们想要在同一个类中定义名字相同的方法,那么它们的参数类型必须 ...
- 零基础学习python_pickle(31课)
上次我提到了对文件的读写等一系列操作,回想下,要想从文件内读取内容无论是read还是readline,读取出来的是不是都是字符串呢?那么如果想让字典.列表这些数据类型保存进文件到读取出来都是原来的类型 ...