/ 用中缀表示法调用扩展函数 1 shl 2 // 等同于这样 1.shl(2) 可变数量的参数和星操作符 可变参数vararg 使用关键字vararg来修饰可变参数。.../* 在函数内部,类型 T 的 vararg 参数的可见方式是作为 T 数组,即上例中的 ts 变量具有类型 Array 。...an Array result.add(t) return result } 因为有命名参数传递法和可以直接在函数后面加括号传递lamba两种方式,其他的和java中的可变参数一致...这里等待后面具体来看什么时候非内联 在 Kotlin 中,我们可以只使用一个正常的、非限定的 return 来退出一个命名或匿名函数。...可以实现dsl风格的代码全靠它 Kotlin 提供了使用指定的 接收者对象 调用函数字面值的功能。 可以调用该接收者对象上的方法而无需任何额外的限定符,可以任意调用接受者的方法和属性。
本文简单谈下Kotlin中的函数,包括表达式函数体,命名参数,默认参数,顶层函数,扩展函数,局部函数,Lambda表达式,成员引用,with/apply函数等。...1.表达式函数体 通过下面这个简单的例子看下函数声明相关的概念,函数声明的关键字是fun,嗯,比JS的function还简单。 Kotlin中参数类型是放在变量:后面,函数返回类型也是。...4.顶层函数 不同于Java中函数只能定义在每个类里面,Kotlin采用了JavaScript 中的做法,可以在文件任意位置处定义函数,这种函数称为顶层函数。...,在Java中可以抽取出独立的函数,但这样有时候对整体结构并不太好,Kotlin提供了局部函数来解决这个问题。...Lambda中的this引用指向的是包围它的类。 如果在Lambda中要用到常规意义上this呢?这个就需要带接收者的函数。看下比较常用的两个函数with和apply。
Kotlin中的内联函数还是挺好玩的 为什么需要内联函数? lambda 表达式会被正常地编译成匿名类。这表示每调用一次 lambda表达式,一个额外的类就会被创建。...内联函数使用 inline 修饰符标记,内联函数在 被使用的时候编译器并不会生成函数调用的代码,而是使用函数实现的真实代码替换每一次的函数调用 内联函数如何运作?...当一个函数被声明为 inline 时,它的函数体是内联的一一换句话说,函数体会被直接替换到函数被调用的地方,而不是被正常调用。...中Int、Long、Double都继承自Number,但是,如果我们在调用上面的函数时,传入了Array,这样是会报错的!!...因为 kotlin中在调用函数时要求参数类名必须完全一致!! 对于上面的函数,如果我们想既可以接收 Array, 也可以接收Array, 那么就可以定义一个具体化类型参数的内联函数.
Kotlin中的泛型和java中的十分类似都是用T表示泛型 kotlin中使用 T 表示泛型。...在定义泛型函数时需要在 fun 后面加入 , 然后指明某个参数的类型为 T 泛型函数的定义: //Kotlin中允许定义全局函数,将函数定义在kt文件中,然后全局可调用 fun appendString...(tag: String, vararg otherInfo: T?)...//遍历可变数组,然后拼接 str = "$str${item.toString()}," } return st } 泛型函数的调用...(count % 3) { //在定义泛型函数时,需要指明T的类型 0 -> appendString("中国四大发明", "造纸术", "火药", "印刷术"
10的 ArrayList 和 transform 函数,在 mapTo 方法中,对集合进行迭代,然后将进行变换后的数据添加到新的集合中,最后返回新的集合。...map 和 flatMap 的主要区别就是在于传入的函数的返回值,一个是任意对象,一个是实现了 Iterable 接口的对象 reduce 例子:打印集合中的元素之和 1fun main(args:...中创建新的集合 ArrayList ,将 ArrayList 和 predicate 函数一并传递给 filterTo 函数。...疑惑点 函数定义中 `T.() -> Unit` 和 `() -> Unit` 的区别 我们一般定义函数都会选择定义 1fun T.makeMoney2(block: () -> Unit)...里的this代表的是自身实例,而 ()->Unit 里,this代表的是外部类的实例 感谢 [Kotlin中,函数作为参数,T.()->Unit 和 ()->Unit 的区别][https://www.jianshu.com
Kotlin尾递归函数理解 kotlin中,如果某个函数的末尾又调用了函数自身,这种就称为尾递归函数。 尾递归函数需要在 fun 前面添加 tailrec。...尾递归函数会使用循环的方式替代递归,从而避免栈溢出。 尾递归不能在异常处理的try、 catch 、 finally 块中使用 。...findFixPoint(x: Double = 1.0): Double = if (x == Math.cos(x)) x else findFixPoint(Math.cos(x)) 再例如: 计算阶乘的函数...//定义计算阶乘的函数 fun fact (n : Int) : Int{ if (n == 1) { return l } else { return n * fact(n - 1) } } 上面函数将调用自身作为其执行体的最后一行代码...此时,上面函数可改为如下形式 //使用尾递归函数的语法 tailrec fun factRec(n: Int, total : Int= 1): Int = if (n == 1) total else
很多同学刚上手使用Kotlin知道它有针对Java NullPointerException的管理,而在Kotlin中?和!!...不懂就问百度呀,确实有人解释它们的区别,比如: 这是输入 "kotlin ?和!!" 搜索到的百度第一条答案,确实这位说的没错。...是一种安全的写法,它体现了Kotlin null safety的特性。KT的语法很灵动,定义参数还可以写成 val room: Room?...当然Kotlin不会让程序出现这种啰嗦的代码,所以里面提供了对象A ?: 对象B表达式,并且取消了Java中的条件表达式 ? 表达式1 : 表达式2这个三元表达式。 ?...和?:基本上能避免程序中出现的所有NullPointerException。
在做kotlin开发中,经常看到一些系统函数里,用函数作为参数,但是又和我们自己写的不太一样 大概是这样子的: public inline fun T.apply(block: T....我们这里来看一下文档是怎么说的, ? 输入图片说明 我们这里看一下画原谅色线的部分,原来这里作用就是可以this代表的对象的不同。...---- 我们首先定义两个函数: fun T.afterMersure(f: T.() -> Unit) { } fun T.afterMersure2...(f: () -> Unit) { } 这两个函数是用于,View测量完成之后的回调。...,这两个函数唯一的区别就是T.()-Unit与()->Unit的区别,我们调用时,在代码块里面写this,的时候,根据代码提示,我们可以看到,连个this代表的含义不一样,T.()->Unit里的this
Kotlin 中的 appy和with方法 apply apply:Calls the specified function block with this value as its receiver...,它接受一个参数block,类型为 T.() -> Unit ( function-with-receiver) 在apply的函数体内,调用了传入的block这个函数,然后返回调用apply函数的对象实例...它的实现代码也只有一行 public inline fun with(receiver: T, block: T.() -> R): R = receiver.block() with为高阶函数...with返回的类型为R,和block的返回类型相同 fun getPersonFromDeveloper(developer: Developer): Person { return with(...is a receiver in kotlin What is a purpose of Lambda's with Receiver?
在以前,因为学过一段时间Kotlin(并没有实际开发中用过),很多东西都忘记了,但是kotlin的代码看起来其实和Java没什么区别,感觉都差不多。所以不要认为 Kotlin 很难学。...首先,什么是内联函数 inline? Kotlin的内联函数属于Kotlin的高级特性之一,使用起来也非常简单。...没加 inline 之前 加上 inline 之后 解释就不用多说了吧,kotlin 自动帮我们将方法在编译期就加在了相应的调用处,免除了 java 中的入方法栈与退栈。...非局部返回标记 为了不让lamba表达式直接返回内联函数,所做的标记 相关知识点:我们都知道,kotlin中,如果一个函数中,存在一个lambda表达式,在该lambda中不支持直接通过return...reified java中,不能直接使用泛型的类型 kotlin可以直接使用泛型的类型 inline fun startActivity() { startActivity(Intent(this
下面我们来说说 Kotlin中的高阶函数 Kotlin 不是纯粹的面向对象语言, Kotlin 的函数也是一等公民,因此函数本身也具有自己 的类型 。...函数类型就像前面介绍的数据类型一样,既可用于定义变量,也可用作函数的形参类 型,还可作为函数的返回值类型 使用函数类型 Kotlin 的每个函数都有特定的类型,函数类型由函数的形参列表、 ·>和返回值类型组成...fun test() { .... } 该函数的形参列表、 ·>和返回值类型为() ->Unit 或(),这就是该函数的类型 。...使用函数类型作为形参类型 Kotiin 支持像使用其他类型一样使用函数类型,因此完全可以在函数中定义函数类型的形 参 例子 //定义函数类型的形参,其中 fn 是( Int )→ Int 类型的形参 fun...着每次调用函数时都可动态传入一个函数,随着实际传入函数的改变,就可以动态改变 map() 函数中的部分计算代码 。
中的集合高阶函数,进行下讲解,降低大家阅读源码的难度,下面看几个用的比较多的高阶函数使用。...,当前的累积值和集合中的下一个元素。...,只能从集合中获取,所以,Kotlin还提供了更加通用的高阶函数——fold,代码如下所示。...❞ 由此可见,在Kotlin中,reduce实际上是一个不完善的高阶函数,大部分时候,都应该避免使用它,而应该使用flod来代替,而且,要注意的是,在其它语言中,例如JavaScript中,它的reduce...函数,实际上和Kotlin的fold函数的逻辑是一样的,而不是Kotlin中reduce的实现。
一、Kotlin 的可空类型和编译时检查几乎所有对象都可以为null,意味着我在调用任何方法时,都需要小心检查对象是否为空。...相比Java中的if-else空检查,这样的写法很简单、易读。...四、Kotlin调用Java代码:平台类型的风险Kotlin 和Java 可以互相调用,但Java代码没有空安全检查,会让Kotlin这些类型为“平台类型”。...六、Kotlin 的优势总结综上总结,Kotlin通过编译时的空检查、可空类型支持和安全调用等功能,几乎不会发生了NPE的发生。Java虽然引入了Optional类解决空值问题,但整体语法很繁琐。...在日常开发中,Kotlin让代码更流畅、更安全,从Java转向Kotlin的开发者可以充分体验到空安全特性的便捷,减少了处理空值所带来的麻烦。
Kotlin 的变量、函数和类型 先看原文章:https://kaixue.io/kotlin-basic-1/ 思考题 1. 子类重写父类的 override 函数,能否修改它的可见性?...private 类中可见 文件中可见 就这么四种可见性,经过真正的尝试,是可以将子类的可见性放开的,比如就是说,父类的可见性是 protected,子类同样可以是 protected,或者改写成 public...as 是强转关键字,如果强转类型操作是正确当然没问题,但如果强转成一个错误的类型,程序就会抛出一个异常。需要进行安全的强转,Kotlin 在设计上考虑到了优雅的处理强转出错的情况,就是使用 as?...使用 Android Studio 创建一个基于 Kotlin 的新项目(Empty Activity),添加一个新的属性(类型是非空的 View),在 onCreate 函数中初始化它。...类型的方法,传入刚才的 View 类型属性,并在该方法中打印出该 View? 的 id。
package com.easy.kotlin // 简单好用的 Kotlin 类型别名, 我们使用 G,F,H 声明了3个函数类型(有点类似Java 中的接口类型的概念) typealias G =...value.length}") } println(foo(1, { it -> it + 1 })) println(foo(10, { it -> it * it })) } // 简单直接的函数定义...= 0 fun g(s: String) = s.length // 简单优雅的高阶函数定义(复合函数): compose(f, g) = f(g(*)) fun h(g: G, f: F): H {...return { x -> f(g(x)) } } // 这个foo函数类型是: (Int) -> T, 正好也就是传入的函数参数 transform fun foo(x: Int...---- 非常感谢您亲爱的读者,大家请多支持!!!有任何问题,欢迎随时与我交流~ ----
public 表示该函数为公共方法,而Kotlin默认就表示函数是公开的,所以省略了关键字 ③ Java使用 void表示该函数没有返回值,而Kotlin中没有关键字void ,若没有返回值不用特别声明...④ Kotlin 新增了关键字 fun,这个fun类似Java中 关键字class ⑤ Java声明输入参数格式 “变量 变量名称”而Kotlin 前面说过参数的命名 “变量名称:变量类型” ⑥...在Java体系中,可变参数可以采用“Object…args”的形式。但是在Kotlin中新增了关键字vararg,表示其后面的参数个数不确定。...以可变的字符串为例 Java写法“String…args”,而Kotlin中的写法“vararg args:Sting?”,函数内部解析的时候,Kotlin会把可变参数当成一个数组。...如果要让该方法同事接收整型和双精度的数组入参,那就得使用泛型T 来自于基类Number 将改为,同时在fun前面加上关键字inline,表示该函数属于内联函数
上一篇文章介绍了Kotlin对函数的基本用法,包括函数的定义、输入参数的声明、输出参数的声明等等,这些足够对付简单的场合了。...既然Kotlin志在取代Java,就必须练成Java所不具备的功夫。本篇文章便从函数的输入参数着手,谈谈Kotlin对输入参数的改进与增强之处。...两种输入对应的函数调用都很简单,只消按照参数顺序依次输入四大发明的名称即可,调用代码如下所示: var isOdd = true //如果从初始赋值中能够知道变量类型,就无需显式指定该变量的类型...这种随时添加对应于程序的可变参数,在Java体系中,可变参数采用“Object... args”的形式;在Kotlin体系中,新增了关键字vararg表示其后的参数个数是不确定的。...以可变的字符串参数为例,Java的写法为“String... args”,而Kotlin的写法为“vararg args: String?”
在Kotlin中,扩展函数是一种非常有用的功能,可以让我们向现有的类添加新的功能,而无需修改类的源代码。在本文中,我们将探讨Kotlin扩展函数的原理和运用,以及如何在Android开发中使用它们。...什么是扩展函数? 扩展函数是Kotlin中的一种特殊函数,它允许我们向一个类添加新的函数,而无需继承或修改这个类的源代码。扩展函数的语法非常简单,只需要在函数名前面加上类名,并用点号隔开即可。...例如,我们可以向Kotlin中的String类添加一个新的函数,用于反转字符串: fun String.reverse(): String { return this.reversed() }...在函数体中,我们调用了SharedPreferences的edit和getBoolean方法。...Kotlin中的一种非常有用的功能,可以让我们向现有的类添加新的功能,而无需修改类的源代码。
函数介绍 apply fun T.apply(f: T.() -> Unit): T { f(); return this } 返回值是本身 run run函数和apply函数很像,只不过...(f: (T) -> R): R = f(this) let是将当前的函数传入后面的闭包中(it),可以随意指定返回值得类型 是不是意味着可以在let中,对其本身进行操作。...都是在本身的调用方式上,强制返回本身 with with函数是一个单独的函数,并不是Kotlin中的extension,所以调用方式有点不一样,返回是最后一行,然后可以直接调用对象的方法,感觉像是let...和apply的结合。...apply`只是将本身做了强制的返回。 T.also{}和T.let{}其实是一样的。also只是将本身做了强制的返回。 with(T){}和T.run{}其实是一致的。
kotlin也写了很长一段时间了,香是真的很香这个东西。但是很多东西也是不求甚解,都是直接开始用,但是为什么我也不关心。举个栗子,就拿拓展函数来说。...然后在你的kotlin类上就可以直接看到kotlin类生成的字节码。 先抛问题在来分析。 java能不能调用到kotlin到拓展函数? 当然可以了。下面的代码块内就是18F.dp()的java写法。...先给各位把字节码的基础简单的介绍下,表格会简单的把字节码里的类型和Java的类型做一次映射。...同时将结果压入操作栈中。 IRETURN 返回上面栈的操作结果。 简单分析完字节码的操作之后,得出来的结论基本就是生成了一个dp的静态函数,以当前的拓展类作为第一个入参。...但是kotlin和java最后编译出来的产物其实都是字节码,那么我们只要从它们最后编译出来的产物去逆向分析下,其实就能得到它们真实的原因了。 最后还是要说语法糖还是真香的。