这里等待后面具体来看什么时候非内联 在 Kotlin 中,我们可以只使用一个正常的、非限定的 return 来退出一个命名或匿名函数。...如果一个函数只有一个表达式,则可以直接写"=" fun double(x:Int):Int=x*2 局部函数 Kotlin 支持局部函数,即一个函数在另一个函数内部。...在 Kotlin 中有一个约定,如果函数的最后一个参数是一个函数,并且你传递一个 lambda 表达式作为相应的参数,你可以在圆括号之外指定它: lock (lock) { sharedResource.operation...如果 Kotlin 可以自己计算出签名,它允许我们不声明唯一的参数,并且将隐含地为我们声明其名称为 it: ints.filter { it > 0 } // 这个字面值是“(it: Int) ->...可以实现dsl风格的代码全靠它 Kotlin 提供了使用指定的 接收者对象 调用函数字面值的功能。 可以调用该接收者对象上的方法而无需任何额外的限定符,可以任意调用接受者的方法和属性。
本文简单谈下Kotlin中的函数,包括表达式函数体,命名参数,默认参数,顶层函数,扩展函数,局部函数,Lambda表达式,成员引用,with/apply函数等。...从例子入手,从一般写法到使用特性进行简化,再到原理解析。 1.表达式函数体 通过下面这个简单的例子看下函数声明相关的概念,函数声明的关键字是fun,嗯,比JS的function还简单。...4.顶层函数 不同于Java中函数只能定义在每个类里面,Kotlin采用了JavaScript 中的做法,可以在文件任意位置处定义函数,这种函数称为顶层函数。...5.扩展函数 扩展函数是类的一个成员函数,不过定义在类的外面 扩展函数不能访问私有的或者受保护的成员 扩展函数也是编译成静态函数 所以可以在Java库的基础上通过扩展函数进行封装,假装好像都是在调用Kotlin...,在Java中可以抽取出独立的函数,但这样有时候对整体结构并不太好,Kotlin提供了局部函数来解决这个问题。
kotlin也写了很长一段时间了,香是真的很香这个东西。但是很多东西也是不求甚解,都是直接开始用,但是为什么我也不关心。举个栗子,就拿拓展函数来说。...返本归元 先介绍个工具,Android Studio的工具栏有个tools/Kotlin/Show Kotlin ByteCode。...然后在你的kotlin类上就可以直接看到kotlin类生成的字节码。 先抛问题在来分析。 java能不能调用到kotlin到拓展函数? 当然可以了。下面的代码块内就是18F.dp()的java写法。...也就是说我们写的拓展函数其实也就是个静态方法,只是把我们拓展的类当作一个静态参数传递给了静态方法内。 深入探索 上面介绍的工具还是要用下,看看到底字节码上的拓展函数是怎么样的。...IRETURN 返回上面栈的操作结果。 简单分析完字节码的操作之后,得出来的结论基本就是生成了一个dp的静态函数,以当前的拓展类作为第一个入参。
Kotlin中的内联函数还是挺好玩的 为什么需要内联函数? lambda 表达式会被正常地编译成匿名类。这表示每调用一次 lambda表达式,一个额外的类就会被创建。...内联函数使用 inline 修饰符标记,内联函数在 被使用的时候编译器并不会生成函数调用的代码,而是使用函数实现的真实代码替换每一次的函数调用 内联函数如何运作?...当一个函数被声明为 inline 时,它的函数体是内联的一一换句话说,函数体会被直接替换到函数被调用的地方,而不是被正常调用。...因为 kotlin中在调用函数时要求参数类名必须完全一致!! 对于上面的函数,如果我们想既可以接收 Array, 也可以接收Array, 那么就可以定义一个具体化类型参数的内联函数....: 内联函数在调用的时候会在调用出把该函数的代码直接复制一份,调用10次就会复制10次,而并非普通函数一样直接引用函数地址。
Kotlin 简单优雅的高阶函数 非常感谢您亲爱的读者,大家请多支持!!!有任何问题,欢迎随时与我交流~ ---- 函数代表一种关系 f 的蕴涵逻辑流。...整个的图G就是一幅美妙的抽象逻辑之塔的 映射图 。 ? image.png 1 . Kotlin 函数式编程: 函数的组合。一切皆是函数。...// 简单直接的函数定义 fun f(x: Int) = x % 2 !...简单优雅的高阶函数定义(复合函数): compose(f, g) = f(g(*)) 组合函数返回传递给它的两个函数的组合: (f、g) = f (g (*))。...API filter,flat,map 等等 val mstrList = strList.filter(h) 同样的逻辑,我们在 Java 8中的实现代码是: package com.easy.kotlin
高阶函数的定义 将函数当做参数或者是返回值的函数 什么是高阶函数 可以看看我们常用的 forEach 函数: 1public inline fun Array.forEach...函数传递给了 forEach 函数,这里采用的是函数引用 。...我们再定义一个类,用来打印 forEach 的值: 1class PdfPrinter { 2 fun println(any: Any) { 3 kotlin.io.println...疑惑点 函数定义中 `T.() -> Unit` 和 `() -> Unit` 的区别 我们一般定义函数都会选择定义 1fun T.makeMoney2(block: () -> Unit)...里的this代表的是自身实例,而 ()->Unit 里,this代表的是外部类的实例 感谢 [Kotlin中,函数作为参数,T.()->Unit 和 ()->Unit 的区别][https://www.jianshu.com
Kotlin中的泛型和java中的十分类似都是用T表示泛型 kotlin中使用 T 表示泛型。...在定义泛型函数时需要在 fun 后面加入 , 然后指明某个参数的类型为 T 泛型函数的定义: //Kotlin中允许定义全局函数,将函数定义在kt文件中,然后全局可调用 fun appendString...//遍历可变数组,然后拼接 str = "$str${item.toString()}," } return st } 泛型函数的调用...btn_vararg_generic.setOnClickListene { tv_function_result.text = when (count % 3) { //在定义泛型函数时...appendString("小于10的素数", 2, 3, 5, 7) else -> appendString("花钱的日子", 5.20, 6.18
内联函数 定义:用关键字inline修饰的函数,叫做内联函数 作用:它们的函数体在编译器被嵌入每一个被调用的地方,减少额外生成匿名类和执行函数的开销 举个具体的例子:比如下面这个kotlin代码 fun...,通过inline,消除了匿名类的开销 另外,可以看kotlin官方api的源码,很多都是定义成了inline函数 public inline fun Iterable.map(transform...1、普通函数,不需要使用inline,jvm会自动的判断是否做内联的优化,inline都是针对高阶函数 2、大量函数体的行数,应该避免,这样会产生过多的字节码数量(每次调用的地方,都会重复生产该函数的字节码...Kotlin在引入inline的同时,也新增了noinline关键字,我们可以把它加在不想要内联的参数开头,该参数便不会具有内联的效果。...总结 内联函数是一种更高效的写法,很多kotlin官方的方法也都采用 内联应该尽量用在轻量的方法中,避免生成过多的字节码 行数:206 字数:1151 主题:默认主题
) 这是函数主体,你想让函数实现什么功能就写出对应的代码即可 以上就是 函数声明的基本格式,以后我们在声明函数的时候也需要遵守上面的格式。...1、函数无返回值 在kotlin中,如果某个函数不需要返回数据,那么这个函数的类型就是 Unit。...+ b 在上面的示例代码中,直接将表达式作为函数体,然后kotlin会自动根据 a+b 的类型来确定 sum 函数的返回值类型,这也就是 类型推断。...(1, 2, 3, 4) }fun varList(vararg vars: Int) { for (v in vars) { println(v) } } 运行结果 补充:Kotlin...中的注释 kotlin支持单行注释和多行注释。
简化SharedPreferences的用法 回顾SharedPreferences的用法,向SharedPreferences中存储数据的过程: 1.调用SharedPreferences的edit(...SharedPreferences.Editor.() -> Unit) { val editor = edit() editor.block() editor.apply() } 通过拓展函数的方式向...SharedPreferences类中添加了一个open函数,并且接收一个函数类型的参数,因此open函数就是一个高阶函数。...open函数内拥有SharedPreferences的上下文,因此这里可以直接调用edit()方法来获取SharedPreferences.Editor对象。...open函数接受的是一个SharedPreferences.Editor类型的参数因此需要调用editor.block()对函数类型参数进行调用,就可以在函数类型参数的具体实现中添加数据了。
浏览量 3 1、构造函数不能声明为虚函数 1)因为创建一个对象时需要确定对象的类型,而虚函数是在运行时确定其类型的。...而在构造一个对象时,由于对象还未创建成功,编译器无法知道对象的实际类型,是类本身还是类的派生类等等 2)虚函数的调用需要虚函数表指针,而该指针存放在对象的内存空间中;若构造函数声明为虚函数,那么由于对象还未创建...,还没有内存空间,更没有虚函数表地址用来调用虚函数即构造函数了 2、析构函数最好声明为虚函数,首先析构函数可以为虚函数,当析构一个指向派生类的基类指针时,最好将基类的析构函数声明为虚函数,否则可以存在内存泄露的问题...如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除指向派生类的基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。子类析构时,要调用父类的析构函数吗?...析构函数调用的次序时先派生类后基类的。和构造函数的执行顺序相反。并且析构函数要是virtual的,否则如果用父类的指针指向子类对象的时候,析构函数静态绑定,不会调用子类的析构。
目的是为创建一个带有非默认方法的接口,这样这个接口就可以将函数模拟成面向对象语言中的一等公民。...比如,Comparable 就是只带有一个 compareTo 方法的 @FunctionalInterface。 回调在函数式接口中很常见。...在构造函数中把接口转换为函数后,@FunctionalInterface 部分的样板代码从 96 个字符减少到 38 个字符,这可是减少了 40%。...onResult(result) } } 前后对比过后,你就会体会到 Kotlin 中这些语法糖是多么的好用。 ? 上面的图片是 Java 转换为 Kotlin 的对比。...如果你也在使用 Kotlin 改造或者编写项目,欢迎在我的 Twitter 下面评论交流你使用 Kotlin 中踩坑填坑经历。
文章目录 一、匿名函数 二、匿名函数的函数类型 三、匿名函数的隐式返回 一、匿名函数 ---- 声明函数时 , 没有 函数名 的函数 是 匿名函数 ; 匿名函数 可以作为 函数参数 , 也可以作为 函数返回值...; 匿名函数 可以 定制修改 已有的 函数 , 如 : 标准库中的函数 ; Kotlin 中对 CharSequence 类进行了扩展 , 定义了 count(predicate: (Char) ->...Boolean) 扩展函数 , 接收一个 (Char) -> Boolean 类型的函数 , 用于 返回匹配给定 匿名函数 的字符数 ; /** * 返回匹配给定[谓词 predicate 匿名函数...---- 匿名函数 可以作为 变量 赋值给 函数类型变量 , 可以作为 函数参数 传递给函数 , 因此 , 匿名函数 与 变量 一样 , 也存在 对应的 函数类型 ; 函数类型 由 参数 和 返回值...决定 ; 有 相同 参数顺序 , 参数个数 和 返回值类型 的函数 , 其 函数类型相同 ; 如上个章节 , 扩展函数 CharSequence.count 接收的匿名函数参数 predicate ,
Kotlin的扩展函数很显然能够优雅的解决这种问题。...通俗的来说扩展函数体里面的this就是receivers的类型 扩展函数怎么用 根据上面定义的扩展函数栗子,来看下这个扩展函数的用法: val list = mutableListOf(1,3,5)...静态扩展函数 首先来回顾下普通的静态函数/变量如何定义,在Kotlin中使用伴生对象类将函数/变量定义在其中,那么该函数/变量就是静态函数/变量了。...这样似乎看起来没有什么问题,但是当我们需要扩展三方类的静态函数时,如果其没有用Kotlin的伴生对象指定静态方法/变量,那么该方案将无法使用,只能用实例去调用。...答案是:之前类中定义的方法、 因此:成员方法优先级高于扩展函数 this的指向 当我们在类中使用扩展函数时,在扩展函数体内想要获取当前类的this,而不是默认的扩展函数的receivers的类型的时候
上一篇文章介绍了Kotlin新增的空安全机制,控制语句部分可算是讲完了,接下来将连续描述Kotlin如何定义和调用函数,本篇文章先介绍函数的基本用法。...那么Kotlin对函数的使用跟Java相比,有哪些区别呢?...; 2、Java使用“public”表示该函数是公共方法,而Kotlin默认函数就是公开的,所以省略了关键字“public”; 3、Java使用“void”表示该函数没有返回参数,而Kotlin不存在关键字...现在有了定义好的函数,若要在Kotlin代码中调用它们,那可一点都没变化,原来在Java中怎么调用,在Kotlin中一样采取“函数名称(参数列表)”的形式进行调用。...对于习惯了Java的开发者而言,Kotlin的这种写法着实别扭,为了方便记忆,我们姑且把函数当作一种特殊的变量,定义函数跟定义变量是同一种写法。
【函数的基本用法】 Kotlin声明方式 先跟Java的声明方式对比一下,从onCreate方法入手看看他们的不同 //Java 声明方式 @Override protected void...通过两者的对比,咱们可以发现 ① Java使用@Override表示该函数重载父类的方法,而Kotlin使用小写的override 在同一行表达重载操作 ② Java 使用 protected /...public 表示该函数为公共方法,而Kotlin默认就表示函数是公开的,所以省略了关键字 ③ Java使用 void表示该函数没有返回值,而Kotlin中没有关键字void ,若没有返回值不用特别声明...以可变的字符串为例 Java写法“String…args”,而Kotlin中的写法“vararg args:Sting?”,函数内部解析的时候,Kotlin会把可变参数当成一个数组。...【几种特殊的函数】 泛型函数 按照之前的例子,函数的输入参数类型必须定义函数的时候需要指定 例如:var int_array:Array = arrayOf(1,2,3) 定义泛型函数的时候
前言 在Kotlin中,高阶函数是指将一个函数作为另一个函数的参数或者返回值。如果用f(x)、g(x)用来表示两个函数,那么高阶函数可以表示为f(g(x))。...Kotlin为开发者提供了丰富的高阶函数,比如Standard.kt中的let、with、apply等,_Collectioins.kt中的forEach等。...Kotlin 使用类似 (Int) – String 的一系列函数类型来处理函数的声明,这些类型具有与函数签名相对应的特殊表示法,即它们的参数和返回值: 所有函数类型都有一个圆括号括起来的参数类型列表以及一个返回类型...常用高阶函数 Kotlin提供了很多高阶函数,这里根据这些高阶函数所在文件的位置,分别进行介绍,先来看一下常用的高阶函数,这些高阶函数在Standard.kt文件中。...2.run 先给出run函数的源码: /** * Calls the specified function [block] and returns its result. */ @kotlin.internal.InlineOnly
文章目录 一、闭包概念 二、Java 中函数作为参数的替代方案 ( 匿名内部类 ) 一、闭包概念 ---- 匿名函数 就是 Lambda 表达式 , 同时也是 闭包 , 三者的是相同的概念 ; 闭包意义...在一个 脚本文件 中 , 如 Kotlin 的脚本 , 就需要 使用 函数 进行作用域区分 , 将一个作用域内的相关代码 , 都写在一个函数中 , 这样就可以将作用域分区分开 ; 匿名函数 作用域 :...B 和 匿名函数 C 中的变量 ; 在 匿名函数 B 中 , 不能引用 匿名函数 C 中的变量 ; 高级函数概念 : 在 函数式编程 中 , 经常使用 高级函数 , 高级函数 是使用 函数类型变量 作为...参数 或 返回值 的 函数 ; 使用 匿名函数 / Lambda 表达式 / 闭包 作为 参数 / 返回值 的函数 是 高级函数 ; Kotlin 中经常使用 链式调用 , 就是 函数式编程 的风格...; 二、Java 中函数作为参数的替代方案 ( 匿名内部类 ) ---- Kotlin 中引入 函数类型 , 将 匿名函数 / Lambda 表达式 / 闭包 作为 函数参数 或 返回值 , 可以写出
常用的全局函数 1. 暂停运行n毫秒的时间; sleep(n) n为毫秒数,1秒等于1000毫秒。 2. ...获取最近一次监测到的正在运行的应用的包名,一般可以认为就是当前正在运行的应用的包名; currentPackage() 2....获取最近一次监测到的正在运行的Activity的名称,一般可以认为就是当前正在运行的Activity的名称; currentActivity() 3. 等待包名和Activity的出现 1. ...判断该函数运行脚本的设备系统的版本号,如果没有达到要求则抛出异常; requiresApi(api) 表示此脚本需要Android API版本达到指定版本才能运行。...判断该函数运行脚本的Auto.js的版本号,如果没有达到要求则抛出异常; requiresAutojsVersion(version) 表示此脚本需要Auto.js版本达到指定版本才能运行。
利用 kotlin 函数作为参数(强烈推荐) 来看一下系统的点击事件在 kotlin 中是什么样的: ? 是不是简直简洁到不像话?...再看看你自己定义的点击事件回调,感觉跟还在用 java 开发一样… 下面就来看个新的写法: 创建一个函数对象,在需要回调的地方调起这个函数: ? 用法: ? 是不是比用对象表达式看起来还要简洁?...2018.12.12 更新: 上边截图里的 kotlin 点击事件回调,还有更简洁的定义方法: ? 之前的写法是声明不可为 null 的函数变量,然后判断是否初始化再去 invoke 函数。...现在声明可为 null 的函数变量,在 invoke 函数的时候用 ?. 表示函数变量可空,如果没有给这个点击事件函数赋值的话,这行代码也不会引起 crash。现在连判断条件都不需要了,更精简了。...这里再说点个人经验,如果你的回调方法不止一个的话,推荐还是声明 interface 来做,这样的话都在一个 interface 里边好管理一些 以上这篇利用 kotlin 的方式自定义回调事件(kotlin
领取专属 10元无门槛券
手把手带您无忧上云