三、表达式

一. 常量和变量

  1. 变量
var a = 2

val b = 2 // 只读变量
  1. 常量
    使用 const 关键字修饰,只能定义在全局范围,只能修饰基本类型,必须立即用字面量初始化
const val b = 3 // 等同于 Java 中 static final int b = 3;
  1. 常量引用
val person = Person(18, "Andy") // person是堆上创建对象
person.age = 19 // 对象改变但引用没变
  1. 编译期和运行时常量
const val b = 3

编译时即可确定常量的值,并用值替换调用处

val c: Int

运行时才能确定值,调用处通过引用获取值

二. 分支表达式

  1. if ... else ..
    和 Java 的 if 语句一样,只是在 kotlin 中叫表达式

  2. when
    等同于 Java 中的 switch

// java
switch (a) {
  case 0: 
    c = 5;
  break
  default:
    c = 20;
}

// kotlin
when(a) {
  0 -> c = 5
  else -> c= 20
}
// 改善成:
c = when(a) {
  0 -> 5
  else -> 20
}
  1. Java 中的 when 在 kotlin 中
var x: Any = ...
c = when {
  x is String -> x.length
  x == 1 -> 100
  else -> 20
}
c = when(val input = readLine()) {
  null -> 0
  else -> input.length
}
  1. try ... catch
try {
  c = a / b
} catch (e : Exception){
  e.printStackTrace()
  c = 0
}

三. 运算符与中缀表达式

  1. 运算符
    (1)kotlin 支持运算符重载
    (2)运算符的范围仅限官方指定的符号
    可以看一下官网介绍:
    https://kotlinlang.org/docs/reference/operator-overloading.html
    比较常见的:
    (1)== 与 equals
// 这两个写法一样
"Hello" == "World"
"Hello".equals("World")

(2)"+" 与 plus
(4)in 与 contains
(5)[] 与 get

val map = mapOf(
  "Hello" to 2,
  "World" to 3)

val value = map["Hello"]
// 等同于
val value = map.get("Hello")

(6)[] 与 set

val map = mutableMapOf(
  "Hello" to 2,
  "World" to 3)

map["World"] = 4
// 等同于
map.set("World",4)

(7)> 与 compareTo

2 > 3
// 等同于
2.compareTo(3) > 0

(8)() 与 invoke

val func = fun(){
  println("Hello")
}

func()
// 等同于
func.invoke()
  1. 中缀表达式
2 to 3
infix fun <A,B> A.to(that: B): Pair<A, B> = Pair(this, that)

四. Lambda 表达式

  1. 一个普通函数
fun func(){
  println("Hello")
}
  1. 匿名函数,去掉函数名 func
fun(){
  println("Hello")
}
  1. 匿名函数的传递,此时的 func 是变量名
val func = fun(){
  println("Hello")
}
  1. 匿名函数的类型
val func: () -> Unit = fun(){
  println("Hello")
}
  1. Lambda 表达式的定义
    Java 中 Lambda 表达式是一个 AMS 格式的语法糖,kotlin 中 Lambda 是一个匿名函数的语法糖。
// Java
Runnable lambda = () -> {
  System.out.println("Hello")
};

// Kotlin
val lambda = {
  println("Hello")
}
  1. Lambda 表达式的类型,返回值的类型就是函数体最后一行返回类型,返回值就是最后一行
    (1)没有参数的
val lambda: () -> Unit = {
  println("Hello")
}

(2)有参数的

// java
interface Function1 {
  void invoke(int p);
}
Function1 f1 = (p) -> {
  System.out.println(p);
}

// Kotlin
val f1: (Int) -> Unit = {
  p: Int -> println(p)
}
//或
val f1: Function1<Int,Unit> = {
  p -> println(p)
}
//或
val f1= {
  p: Int -> println(p)
}

(3)参数省略形式

val f1: Function1<Int,Unit> = {
  println(it)
}

五. 案例

为 String 实现四则运算

operator fun String.minus(right: Any?) 
  = this.replaceFirst(right.toString(), "")

operator fun String.times(right: Int): String {
  return (1..right).joinToString(""){this}
}

operator fun String.div(right: Any?): Int {
  val right = right.toString()
  return this.windowed(right.length,1) {
    it == right
  }.count{ it }
}

fun main() {
  val value = "HelloWorld World"

  println(value - "World")

  println(value * 2)

  println(value / "l")


}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335