《第一行代码 第3版》学习笔记——Kotlin讲堂:标准函数和静态方法
标准函数with、run和apply
Kotlin的标准函数指的是Standard.kt文件中定义的函数,任何Kotlin代码都可以调用所有的标准函数。
let函数
该函数提供了函数式API的编程接口,并将原始调用对象作为参数传递到Lambda表达式中。
/*** Calls the specified function [block] with `this` value as its argument and returns its result.** For detailed usage information see the documentation for [scope functions](https://kotlinlang.org/docs/reference/scope-functions.html#let).*/
@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R {contract {callsInPlace(block, InvocationKind.EXACTLY_ONCE)}return block(this)
}
let函数主要配合?.进行使用,可以在外部判断后,如果对象不为空,则将其传入let的lambda表达式之中,处理该对象的多条调用。
fun doStudy() {study?.let {it.readBooks()it.doHomework()}
}
同时,let函数还可以处理全局变量的判空问题。如果使用if语句则仍然会提示错误,这是因为全局变量随时有可能被其他线程修改,即使做了判空处理,也会有空指针的风险。
with函数
with函数接收两个参数:第一个参数可以是一个任意类型的对象,第二个参数是一个Lambda表达式。with函数会在Lambda表达式中提供第一个参数对象的上下文,并使用Lambda表达式中的最后一行代码作为返回值返回。
val result = with(obj) {//这里是obj的上下文"value"//with函数的返回值
}
with函数的左右是可以在连续调用同一个对象的多个方法时让代码变得更加精简,如下所示:
val list = listOf<String>("Apple", "Banana", "Orange", "Pear", "Grape")
val builder = StringBuilder()
builder.append("Start eating fruits.\n")
for (fruit in list) {builder.append(fruit).append("\n")
}
builder.append("Ate all fruits")
val result = builder.toString()
println(result)
使用with函数精简之后
val list = listOf<String>("Apple", "Banana", "Orange", "Pear", "Grape")
val result = with(StringBuilder()) {append("Start eating fruits.\n")for (fruit in list) {append(fruit).append("\n")}append("Ate all fruits")toString()
}
println(result)
run函数
run和with非常类似,润函数通常不会直接调用,而是要在某个对象的基础上调用。run只接收一个Lambda参数,并且会在Lambda表达式中提供调用对象的上下文。
val result = obj.run {//这里是obj的上下文"value" //run函数的返回值
}
对于with函数前面的可以这样修改成run函数版本
val list = listOf<String>("Apple", "Banana", "Orange", "Pear", "Grape")
val result = StringBuilder().run {append("Start eating fruits.\n")for (fruit in list) {append(fruit).append("\n")}append("Ate all fruits")toString()
}
println(result)
apply函数
apply函数也是在某个对象上调用的,并且只接收一个Lambda参数,也会在Lambda表达式中提供调用对象的上下文,但是apply函数无法指定返回值,而是会自动返回调用对象本身。
apply的版本为
val list = listOf<String>("Apple", "Banana", "Orange", "Pear", "Grape")
val result = StringBuilder().apply {append("Start eating fruits.\n")for (fruit in list) {append(fruit).append("\n")}append("Ate all fruits")
}
println(result.toString())
返回的是对象本身,调用toString方法转成String。
定义静态方法
Java中静态方法可以用类名调用,而在Kotlin中没有静态方法的概念。
对于Java中工具类的这种功能,Kotlin中推荐使用单例类的方式实现。
public class Util {public static void doAction() {System.out.println("do action");}
}
1、使用单例类
object Util {fun doAction() {println("do action"}}
}
单例类就可以像Java中的静态方法一样使用Util.doAction()进行调用。使用object关键字后,Kotlin会自动帮我们创建一个类,并保证这个类全局只有一个。
但是使用单例类的方式会使得单例类中的所有方法都变成了类似静态调用的方式。如果希望将其中的一个方法变成静态方法的调用方式,可以使用companion object。
2、使用companion object
class Util {fun doAction1() {println("do action1"}}companion object {fun doAction2() {println("do action2"}}}
}
companion object这个关键字实际上会在Util类的内部创建一个伴生类,而doAction2方法就是定义在这个伴生类里面的实例方法。只是Kotlin会保证Util类中只会存在一个伴生类对象,所以可以像静态方法式的调用。
上述两种方式都不是真正的静态方法,而是提供一些语法特性来支持静态方法调用的方式,Kotlin也提供了两种真正实现静态方法。
3、使用注解
如果给单例类和companion object中的方法加上@JvmStatic注解,那么Kotlin编译器就会将这些方法编译成真正的静态方法。
class Util {fun doAction1() {println("do action1"}}companion object {@JvmStaticfun doAction2() {println("do action2"}}}
}
需要注意的是,这个注解只能加在单例类和companion object中的方法上。这样这些方法就是真正的静态方法了,不管是在Kotlin还是在Java中都可以静态调用。
4、使用顶层方法
顶层方法指的是那些没有定义在任何类中的方法,Kotlin编译器会将这些方法全部编译成静态方法。
fun doSomething() {println("do something")
}
在Kotlin中可以直接使用函数名进行调用,但是在Java中怎么调用呢。Java中所有的方法都必须定义在类中,所以Kotlin编译器会将顶层函数所在的文件名编译成一个类,doSomething就是以静态方法的形式定义在该类中的,所以Java中可以通过Kotlin文件名和方法名调用。
《第一行代码 第3版》学习笔记——Kotlin讲堂:标准函数和静态方法相关推荐
- Android 学习之《第一行代码》第二版 笔记(二十三)Material Design 实战 —— 卡片式布局
实现基础: Android 学习之<第一行代码>第二版 笔记(二十二)Material Design 实战 -- 悬浮按钮和可交互提示 卡片式布局 卡片式布局是 Materials Des ...
- 第一行代码Android第二章读书笔记
第一行代码Android第二章读书笔记 Activity 1.1 手动创建活动 1.2 Toast和Menu/销毁活动 Intent 2.1 显示/隐式 2.2 传递/返回数据 活动的生命周期 3.1 ...
- 第一行代码-android-第三版-pdf扫描-思维导图-课件-源码
第一行代码-android-第三版-pdf扫描-思维导图-课件-源码 一帮公众号各种要你关注, 各种压缩包层层套娃要密码, 还要进群, 真他妈日了gou了,找了半天 分享给大家, 毫无套路! pdf扫 ...
- 第一行代码第三版笔记
第3章 Activity 主acitivity:程序运行起来首先启动的activity manifest <?xml version="1.0" encoding=" ...
- Android build.gradle文件详解(转述自《Android第一行代码》第二版)
Android build.gradle文件详解 1. 最外层目录下的build.gradle文件 1.1 repostories 1.2 dependencies 2. app目录下的build.g ...
- $《第一行代码:Android》读书笔记——第6章 数据持久化
主要讲述了Android数据持久化的三种方式:文件存储.SharedPreference存储.SQLite数据库存储. (一)文件存储 其实Android中文件存储方式和Java的文件操作类似,就是用 ...
- 《第一行代码》12.2学习中遇到的一些问题and心得
1.书中P411中的activity_main.xml中的Toolbar不应该使用<android.support.v7.widget.Toolbar/> 应该使用<androidx ...
- 安卓第一行代码第3版pdf_SPECFEM2D用户手册——第3章 网格生成——3.1 如何使用SPECFEM2D...
参考资料 manual_SPECFEM2D.pdf 数值实现 Julia 1.4.2/MATLAB 2019a 备用系统 Ubuntu 64 地球物理局 地震波动力学实验室 谱元组 译# 声明 # 欢 ...
- Java学习经典《第一行代码》第二版
第1章 开始启程--你的第一行Android代码 1 1.1 了解全貌--Android王国简介 2 1.1.1 Android系统架构 2 1.1.2 Android已发布的版本 3 1.1.3 A ...
- 第一行代码 第三版 第11章网络技术 11.6.1 Retrofit 应用 报错:android.system.ErrnoException: isConnected failed: ECONNRE
在学习第11章 11.6.1Retrofit用法,这节的时候发生的报错:书上关于这个地方并没有说. 我搜索问题的关键语句是: java.net.ConnectException: Failed to ...
最新文章
- checkpoint技术mysql_认识MySQL中的Checkpoint技术
- pythonweb接口优化_记一次 Python Web 接口优化
- HlpViewer.exe 单独打开
- jaas_受JAAS保护的JAX-RS端点
- Java反序列化json内存溢出_fastJson与一起堆内存溢出'血案'
- 160 - 44 defiler.1.exe
- 怎么样实现对一个对象的深拷贝
- maya嵌入python_#113 如何给Maya添加一个Python Command Shell ? | 一半君的总结纸
- linux那些事之页迁移(page migratiom)
- fspecial在matlab中什么意思,Matlab中fspecial的用法 | 学步园
- win7系统关闭蓝牙服务器,win7系统怎么打开蓝牙的两种方法
- php 协成wifi_2016最新协成wifi认证系统二次开发版源码 支持中文ssid 无加密无限制...
- 电视浏览器Emotn V1.0.0.2+悟空跨屏电视输入法
- java对外接口安全问题_怎么保证对外暴露接口的安全性(调用频率限制)
- 微信企业号支付授权目录
- asp毕业设计——基于asp+sqlserver的选题管理系统设计与实现(毕业论文+程序源码)——选题管理系统
- 利用WebBrower封装的自己的浏览器MyIE源代码
- 机械工程基础知识点汇总
- 牛客网 精品课程 《直通BAT面试算法精讲课》 优惠码立减10元
- touch服务器端文件,Sencha touch 2 入门 -------- DataView 显示服务器端JSON文件数据...
热门文章
- 小米路由作二级路由,挂在上级路由之下,samba能被上级访问(之二)
- Night小课堂04 HTML表单
- 2010.10.07更新,我的LLK算法的c++实现
- Python selenium登录百度指数获取cookie跳过验证码破解加密得出数据
- Item 27: Familiarize yourself with alternatives to overloading on universal references.
- 轻松收纳,随时享受更安全的温暖,HITH电动折叠足浴器D3体验
- Visual Studio - 程序打包安装与部署(使用Visual Studio Installer)
- 一分钟教会你制作培训机构招生H5宣传页
- PVT重磅升级:三点改进,性能大幅提升
- 使用switch语句判断一星期中的哪一天