Kotlin的::符号怎么用

目录
  • 前言
  • 正文
    • 传递函数优化
  • 成员引用 ::
  • 使用范围
  • 绑定引用
  • 总结

前言

在阅读Kotlin的代码时,经常有看到 :: 这个符号,这个符号专业术语叫做成员引用,在代码中使用可以简化代码,那到底怎么使用呢以及使用的范围,这篇文章就来好好捋一下。

正文

这里虽然很熟悉,但是我们还是从简单说起,需要了解为什么这样设计。

传递函数优化

这里我们举个栗子,就看这个熟悉的sortBy排序函数,先定义People类:

//测试代码
data class People(val name: String,val age: Int){
    //自定义的排序条件
    fun getMax() : Int{
        return age * 10 + name.length
    }
}

然后我们来进行排序:

val people = People("zyh",10)
val people1 = People("zyh1",100)
val peopleList = arrayListOf(people,people1)
//给sortBy传入lambda
peopleList.sortBy { people -> people.getMax() }

这里我们给sortBy函数传递一个lambda,由于sortBy函数是内联的,所以传递给它的lambda会被内联,但是假如现在有个问题,就是这些lambda已经被定义成了函数变量,比如我定义了一个顶层函数:

//定义了一个顶层函数
fun getMaxSort(people: People): Int{
    return (people.age) * 10 + people.name.length
}

或者排序条件已经定义成了一个变量值:

//排序条件
val condition = { people: People -> people.getMax() }

那这时如果我想再进行排序必须要这么写了:

//调用一遍函数
peopleList.sortBy { getMaxSort(it) }
//传递参数
peopleList.sortBy(condition)

然后这里我们可以利用成员引用 :: 符号来优化一下:

//直接就会调用顶层函数getMaxSort
peopleList.sortBy(::getMaxSort)
//直接就会调用People类的getMax函数
peopleList.sortBy(People::getMax)

这里看起来就是语法糖,可以简化代码。

成员引用 ::

你有没有想过这里是为什么,这里使用了 :: 符号其实就是把函数转换成了一个值,首先我们使用

val condition = { people: People -> people.getMax() }

这种时,其实condition就是一个函数类型的变量,这个我们之前文章说过,Kotlin支持完整的函数类型,而使用高阶函数可以用lambda,但是getMaxSort()函数它就是一个函数了,它不是一个值,除非你再外面给它包裹一层构成lambda,所以这里调用condition传递进的是sortBy()中,而getMaxSort(it)是以lambda的形式又包裹了一层。
但是使用 :: 符号后,也就是把函数转换成了一个值,比如 People::getMax 这就是一个值,它代表的就是People内的getMax函数。
而 ::getMaxSort 也是一个值,它表示getMaxSort函数。

使用范围

前面2个例子其实也就表明了这种成员引用的使用范围,一个是类的函数或者属性,还有就是顶层函数,它没有类名,可以省略。

绑定引用

这里再额外说一个知识点,前面说成员引用都是 类名:属性名 这种格式,比如 People::getMax ,但是它在后面KT版本变化后进行了优化,可以看下面代码:

//定义一个people实例
val people = People("zyh",10)
//利用成员引用,把函数转换成值
val ageFun = People::age
val age = ageFun(people)
//直接在对象实例上使用 ::
val ageValue = people::age

从上面我们发现,ageValue的值可以从实例上通过成员引用调用得到,不过这里区别就大了,ageFun是一个函数类型,而ageValue则是一个int值。

总结

总结一下,其实成员引用 :: 很简单,它就是把函数给转成了值,而这个值可以看成是函数类型,这样说就十分好理解了。

到此这篇关于Kotlin的::符号怎么用的文章就介绍到这了,更多相关Kotlin ::符号内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Kotlin结合Rxjava+Retrofit实现极简网络请求的方法

    前言 因为最近正在写的项目集成了两个网络请求框架(Volley and Retrofit)对比之下也是选择了Retrofit.既然选择那自然要让自己以后开发更加省力(就是懒).于是我在Retrofit中加入了Rxjava,这也是当下蛮流行的一个请求框架.然后又利用了Kotlin的一些新特性,使网络请求变得特别简单,代码量特别少. Kotlin镇楼 RxJava RxJava学习是一个曲折漫长的过程,但一旦掌握,妙用无穷. 通过这里了解更多:http://www.jb51.net/article/

  • Kotlin中实体类的创建方式

    类的基本格式 class 类名{ } 属性的基本格式 var 属性名字 : 类型 下面是实体类代码 package com.dldw.entity import java.util.* class Demo { //var 声明的属性可以被二次赋值 val声明的是不可变属性,赋值以后不能在赋值,否则编译报错 //长整型 64位 注意后面加大写L var height: Long? = 0L //整型 32 位 var id : Int?= 0 //短整型 16位 var short :Short

  • Android Kotlin的使用及简单实例

    Android Kotlin的使用及简单实例 写在前面的话,作为一个不熬夜的人,一觉醒来发现Kotlin成为了Android的官方语言,可谓是大喜过望.为了趁热打铁,我决定提前三天放出原定本周日Release的文章.希望能及时让大家了解一下Kotlin. 相信很多开发人员,尤其是Android开发者都会或多或少听说过Kotlin,当然如果没有听过或者不熟悉也没有关系.因为本篇文章以及博客后期的内容会涉及到很多关于Kotlin的知识分享. 在写这篇文章前的一个多月,Flipboard中国的Andr

  • Kotlin编写Android适配器Adapter

    说好今天要写一个使用Kotlin写Adapter的列子,我想了半天也没有组织好语言,直接上代码吧,有一定Android基础的小伙伴肯定是能看的懂的 package com.example.administrator.kotlintest import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import and

  • kotlin和Java的相互调用示例详解

    前言 互操作就是在Kotlin中可以调用其他编程语言的接口,只要它们开放了接口,Kotlin就可以调用其成员属性和成员方法,这是其他编程语言所无法比拟的.同时,在进行Java编程时也可以调用Kotlin中的API接口. 1.在kotlin中调用Java方法 Kotlin和Java是两种不同的语言,所以在互相调用的时候,会有一些特殊的语法.kotlin中对象属性默认就带有setter和getter方法,所以在kotlin中调用Java时直接变量名点属性就可获取到属性的setter和getter的一

  • Kotlin中常见的符号详解

    前几年的Google I/O大会上,Google正式宣布,Kotlin将会成为Android开发的官方支持语言.除了Android外,Kotlin还可以完全作为服务端开发的语言,比如在未来的Spring 5就将对Kotlin提供强大的支持.以及浏览器编程语言,与JS进行交互. Kotlin是一门静态语言,支持多种平台,包括移动端.服务端以及浏览器端,此外,Kotlin还是一门融合了面向对象与函数式编程的语言,支持泛型.安全的空判断,并且Kotlin与Java可以做到完全的交互. 现在介绍Kotl

  • Kotlin实现静态方法

    工具类 全都是静态方法的情况 : class 类名 改为 object 类名 即可 package redwolf.com.moreimageupload import okhttp3.MultipartBody import java.io.File /** * @作者 RedWolf * @时间 2017/5/20 10:52 * @简介 MoreImageUtils.kt */ object MoreImageUtils { fun filesToMultipartBodyParts(fi

  • Kotlin如何直接使用控件ID原理详析

    前言 最近断断续续地把项目的界面部分的代码由JAva改成了Kotlin编写,并且如果应用了kotlin-android-extensions插件,一个显而易见的好处是再也不用写 findViewById()来实例化你的控件对象了,直接操作你在布局文件里的id即可,这一点我感觉比butterknife做的还简洁友好. Activity import android.support.v7.app.AppCompatActivity import android.os.Bundle import ko

  • Kotlin的::符号怎么用

    目录 前言 正文 传递函数优化 成员引用 :: 使用范围 绑定引用 总结 前言 在阅读Kotlin的代码时,经常有看到 :: 这个符号,这个符号专业术语叫做成员引用,在代码中使用可以简化代码,那到底怎么使用呢以及使用的范围,这篇文章就来好好捋一下. 正文 这里虽然很熟悉,但是我们还是从简单说起,需要了解为什么这样设计. 传递函数优化 这里我们举个栗子,就看这个熟悉的sortBy排序函数,先定义People类: //测试代码 data class People(val name: String,v

  • Java8中Optional类型和Kotlin中可空类型的使用对比

    本文主要给大家介绍了关于Java8中Optional类型和Kotlin中可空类型使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 在 Java 8中,我们可以使用 Optional 类型来表达可空的类型. package com.easy.kotlin; import java.util.Optional; import static java.lang.System.out; /** * Optional.ofNullable - 允许传递为 null 参数 *

  • Kotlin基础教程之Run,标签Label,函数Function-Type

    Kotlin基础教程之Run,标签Label,函数Function-Type 在Java中可以使用{}建立一个匿名的代码块,代码块会被正常的执行,除了改变了作用域之外,似乎并没有什么其他的作用.然而在Kotlin中却不能这么做,这是为什么呢? 其实,我们都知道一个函数一定与一个内存地址相关,而一个匿名的代码块其实也相当于是一个匿名的函数.在Kotlin中一般使用run函数来运行一段匿名代码块. 如下: 在Kotlin中使用标识符后跟@符号来定义一个标签,使用@后跟标识符来引用一个标签,run函数

  • 用Kotlin实现Android点击事件的方法

    近期,Google宣布Kotlin成为了Android一级开发语言.于是就刚刚简单的研究了一下,查资料的时候发现现成的资料还是很少的,于是决定自己记录一下,方便以后查看,也供其他人一个参考. 在android中,点击事件大致分为三种写法: 1. 匿名内部类. 2. Activity实现全局OnClickListener接口. 3. 指定xml的onClick属性. 今天用Kotlin实现这三种方式实现点击事件 匿名内部类:这种方式最简单 override fun onCreate(savedIn

  • 详解Kotlin 高阶函数 与 Lambda 表达式

    详解Kotlin 高阶函数 与 Lambda 表达式 高阶函数(higher-order function)是一种特殊的函数, 它接受函数作为参数, 或者返回一个函数. 这种函数的一个很好的例子就是 lock() 函数, 它的参数是一个锁对象(lock object), 以及另一个函数, 它首先获取锁, 运行对象函数, 然后再释放锁: fun <T> lock(lock: Lock, body: () -> T): T { lock.lock() try { return body()

  • 详解Kotlin的空指针处理

    详解Kotlin的空指针处理 Kotlin的空指针处理相比于java有着极大的提高,可以说是不用担心出现NullPointerException的错误,kotlin对于对象为null的情况有严格的界定,编码的阶段就需要用代码表明引用是否可以为null,为null的情况需要强制性的判断处理. 咋看一下这些在java里面其实也有,问题是一般开发中不写也是可以的(大部分开发不会花很多时间考虑这些),等出了空指针错误再一个个打补丁.这样往往会遗漏很多空指针,后期的解决仅仅是做一个if判断,没有从根源解决

  • Kotlin基础教程之伴生对象,getter,setter,内部,局部,匿名类,可变参数

    先来看一个名为Message的类 在这个类中有一段包含在companion object中的代码,需要说一下的是,Kotlin的class并不支持static变量,所以需要使用companion object来声明static变量,其实这个platformStatic变量也不是真正的static变量,而是一个伴生对象, 这个伴生对象位于Message类中定义的一个叫做Companion的内部类中,如图: 可以看到在Kotlin中编译器自动生成类是很常见的事情,那么这个伴生对象作何理解呢? 我的理

  • Kotlin教程之函数和包的定义和流程控制

    Kotlin教程之函数和包的定义和流程控制 包名的定义 在xxx.kt文件的顶部进行定义,使用package关键字,定义后,引用包内函数或类,使用包前缀: package cn.jasonmarzw //包定义 fun doSomething(){} // 定义的函数 class User(){} //定义的类 在其他文件中使用时: 可以直接使用 cn.jasonmarzw.doSomething()和 cn.jasonmarzw.User进行调用.可以像Java一样,使用import引入所需要

  • Android Kotlin开发实例(Hello World!)及语法详解

    Android Kotlin开发实例及语法详解 前言 Kotlin是一种在 Java虚拟机上执行的静态型别编程语言,它主要是由俄罗斯圣彼得堡的JetBrains开发团队所发展出来的编程语言.该语言有几个优势 1. 简洁 它大大减少你需要写的样板代码的数量. 2. 安全 避免空指针异常等整个类的错误. 3. 通用 构建服务器端程序.Android 应用程序或者在浏览器中运行的前端程序. 4. 互操作性 通过 100% Java 互操作性,利用 JVM 既有框架和库. 配置 在我们的AndroidS

随机推荐