空语句

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语言编程技巧集的更多相关文章

  1. 一些有意思的面试题(持续更新) .C语言编程技巧札记

    一些有意思的面试题(持续更新) http://blog.csdn.net/wangyuling1234567890/article/details/38565239 C语言编程技巧札记 http:// ...

  2. C语言编程技巧-signal(信号)[转]

    自 http://www.uml.org.cn/c++/200812083.asp 信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用 ...

  3. 用Kotlin语言重新编写Plaid APP:经验教训(I)

    原文标题:Converting Plaid to Kotlin: Lessons learned (Part 1) 原文链接:http://antonioleiva.com/plaid-kotlin- ...

  4. 15个提高编程技巧的JavaScript工具

    原文地址:http://www.imooc.com/wenda/detail/243523 JavaScript脚本库是一个预先用JavaScript语言写好的库,它方便了我们开发基于JavaScri ...

  5. BASH的保护性编程技巧

    BASH的保护性编程技巧   shell常用逻辑判断 -b file 若文件存在且是一个块特殊文件,则为真 -c file 若文件存在且是一个字符特殊文件,则为真 -d file 若文件存在且是一个目 ...

  6. 安卓开发(2)—— Kotlin语言概述

    安卓开发(2)-- Kotlin语言概述 Android的官方文档都优先采用Kotlin语言了,学它来进行Android开发已经是一种大势所趋了. 这里只讲解部分的语法. 如何运行Kotlin代码 这 ...

  7. 释放Android的函数式能量(I):Kotlin语言的Lambda表达式

    原文标题:Unleash functional power on Android (I): Kotlin lambdas 原文链接:http://antonioleiva.com/operator-o ...

  8. linux 操作系统下c语言编程入门

    2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理  ...

  9. Kotlin 语言高级安卓开发入门

    过去一年,使用 Kotlin 来为安卓开发的人越来越多.即使那些现在还没有使用这个语言的开发者,也会对这个语言的精髓产生共鸣,它给现在 Java 开发增加了简单并且强大的范式.Jake Wharton ...

随机推荐

  1. [UE4]反射

    1.根据名字获得类(C++支持,蓝图本身不支持但可以通过工厂模式模拟) 国外大神提供的封装好的C++实现: https://github.com/getsetgames/BlueprintReflec ...

  2. 使用Redis-Dump 导出、导入redis数据

    一.安装ruby https://www.cnblogs.com/EikiXu/p/9406707.html 二.安装redis-dump工具 yum install ruby rubygems ru ...

  3. U3D学习10——关节和射线检测

    1.弹簧  2.铰链  3.固定关节  4.角色关节  5.自定义关节  6.raycast和raycasthit 射线有位移参数,可以设定只触发某一层的. 7.射线检测用于高速和精确 update是 ...

  4. Everything You Always Wanted to Know About SDRAM (Memory): But Were Afraid to Ask

    It’s coming up on a year since we published our last memory review; possibly the longest hiatus this ...

  5. mysql-5.7.16-winx64解压版安装超详细图文教程

    1.安装: 将下载的mysql-5.7.16-winx64压缩包解压后的整个目录放在自己喜欢的位置,我的放在D盘根目录下 2.配置: 进入mysql-5.7.16-winx64目录,将里面的my-de ...

  6. linux下用命令修改文件内容

    修改test_modify.sh中的LICENSE_INFO test_modify.sh #!/bin/bash licenseInfo=LICENSE_INFO licenseProduct=LI ...

  7. Python网络爬虫http和https协议

    一.HTTP协议 1.官方概念: HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文 ...

  8. MyBatis批量增删改查操作

      前文我们介绍了MyBatis基本的增删该查操作,本文介绍批量的增删改查操作.前文地址:http://blog.csdn.net/mahoking/article/details/43673741 ...

  9. Git上传项目失败:Push rejected: Push to origin/master was rejected

    解决方案如下: 1.切换到自己项目所在的目录,右键选择GIT BASH Here,Idea中可使用Alt+F12 打开终端 2.在terminl窗口中依次输入命令: git pull git pull ...

  10. ES6入门声明

    let.var区别点 1.let只在命令所在的代码块中有效. 2.变量一定要先声明在使用,否则会报错,不存在Es5的变量提升(暂时性死区,不存在重复使用). 3.块级作用域中存在let命令,所声明的变 ...