首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin | 作用域函数

Kotlin 标准库包含了几个特殊函数,其目的是调用对象上下文环境(context)中执行代码块。当你提供了 lambda 表达式对象上调用此类函数时,它会形成一个临时作用域。...于是,在他们 lambda 中,this 对象可用于普通类函数中。大多数情况下,访问接收者成员时,可以省略 this 关键字,让代码保持简洁。...let 可用于调用链结果上调用一个或多个函数。...: null 对象上执行 lambda:let 将表达式作为局部范围中变量引入:let 对象配置:apply 对象配置并计算结果:run 运行需要表达式语句:非扩展 run 附加效果:also...这些函数允许你调用链中嵌入对象状态检查。 这两个函数作用是对象过滤器,takeIf 返回满足条件对象或 null。takeUnless 则刚好相反,它返回不满足条件对象或 null

91430
您找到你想要的搜索结果了吗?
是的
没有找到

设计模式~命令模式

具体命令角色(ConcreteCommand): 定义一个接收者和行为之间弱耦合;实现execute()方法,负责调用接收者相应操作。execute()方法通常叫做执行方法。...请求者角色(Invoker): 负责调用命令对象执行请求,相关方法叫做行动方法接收者角色(Receiver): 负责具体实施和执行一个请求。...任何一个类都可以成为接收者,实施和执行请求方法叫做行动方法。...命令模式活动序列: 1. 客户端创建了一个ConcreteCommand对象,并指明了接收者2. 请求者对象保存了ConcreteCommand对象 3....ConcreteCommand对象调用接收一方方法执行请求。 什么情况下使用命令模式 使用命令模式作为回面向对象系统中替代。回便是先将一个函数登记上,然后以后调用此函数。

43920

Golang学习笔记 方法和接口

这个特性有点像Kotlin和C#中扩展方法,定义了带有接收者方法之后,接收者这个类型就好像定义了这个方法一样,我们可以直接在该类型上调方法。这在功能上,和面向对象概念是很类似的。...接收者方法接受者类型,必须和接收者方法定义同一个包中。所以很多非自定义类型,以及基本类型都不能当做接收者类型。当然也可以投机取巧,自己包中重新为这些类型取个名字即可。...+ str) } 指针接收者 接收者类型可以是指针,如果希望接收者方法中修改接收者属性,就需要指针类型了。...Golang中接口是隐式实现,也就是说我们不需要implements这些关键字。只要一个类型接收者方法和接口中定义方法一致,Golang就认为这个类型实现了该接口。下面是一个简单例子。...什么方法都没定义接口就是接口。

68580

Golang方法和接口

这个特性有点像Kotlin和C#中扩展方法,定义了带有接收者方法之后,接收者这个类型就好像定义了这个方法一样,我们可以直接在该类型上调方法。这在功能上,和面向对象概念是很类似的。...接收者方法接受者类型,必须和接收者方法定义同一个包中。所以很多非自定义类型,以及基本类型都不能当做接收者类型。当然也可以投机取巧,自己包中重新为这些类型取个名字即可。..." + str) } 指针接收者 接收者类型可以是指针,如果希望接收者方法中修改接收者属性,就需要指针类型了。...Golang中接口是隐式实现,也就是说我们不需要implements这些关键字。只要一个类型接收者方法和接口中定义方法一致,Golang就认为这个类型实现了该接口。下面是一个简单例子。...什么方法都没定义接口就是接口。

1K50

Golang方法和接口

这个特性有点像Kotlin和C#中扩展方法,定义了带有接收者方法之后,接收者这个类型就好像定义了这个方法一样,我们可以直接在该类型上调方法。这在功能上,和面向对象概念是很类似的。...接收者方法接受者类型,必须和接收者方法定义同一个包中。所以很多非自定义类型,以及基本类型都不能当做接收者类型。当然也可以投机取巧,自己包中重新为这些类型取个名字即可。..." + str) } 指针接收者 接收者类型可以是指针,如果希望接收者方法中修改接收者属性,就需要指针类型了。...Golang中接口是隐式实现,也就是说我们不需要implements这些关键字。只要一个类型接收者方法和接口中定义方法一致,Golang就认为这个类型实现了该接口。下面是一个简单例子。...什么方法都没定义接口就是接口。

79170

Kotlin 1.2 新特性

比如说,如果你调用一个返回“T”泛型方法时,并将它返回值“T”转换为特定类型如“Foo”,编译器就会推断出这个方法调用中“T”其实是“Foo”类型。...val button = findViewById(R.id.button) as Button 智能转换 当一个变量为某个安全表达式(如校验非)所赋值时,智能转换也同样运用于这个安全调用接收者。...这也使得可调用引用在你引用外部接收者成员lambda中更方便。 弃用 Kotlin1.2版本也弃用了很多不合理东西。...Java默认方法调用 Kotlin 1.2之前,接口成员针对JVM 1.6情况下重写Java默认方法会在超级调用上产生一个警告:Super calls to Java default methods...内联扩展修复 以前版本中,平台类型上调内联扩展函数没有检查接收器是否为null,并因此允许null转义到其他代码中。

1.7K100

你知道defer参数和接收者是如何被取值

我们文章使用defer释放资源一文中讲过defer语句是在其所在函数返回后才被执行。在前面章节中,我们只是用了不带参数defer调用。...status变量来调用logStatus函数 ③ 闭包中通过引用status变量来调用incrementStatusCounter ④ 参数列表 我们将logStatus和incrementStatusCounter...2 带指针和值接受器defer 当给一个方法指定接收者时候,这个接收者可以是一个值拷贝,也可以是一个指针。简单来说,就是指针接收器可以修改接收器指向值。想反,值拷贝接收器是原类型值一个拷贝。...当我们一个方法上使用defer时,会执行和参数取值相同逻辑。...然而,该指针引用了一个结构体,该结构体函数返回前发生了变化。因此,该实例输出是bar。 3 小结 总之,一个方法或函数上调用defer,调用参数是被立即取值

43720

kotlin--扩展

之间使用了kotlin标准函数、匿名函数,觉得它十分灵活,简便。...其实kotlin标准函数就是用了扩展 一、扩展函数 1.定义扩展函数 当我们需要对一个类新增一个方法时,Java中需要写一个子类继承它,然后添加我们方法。...扩展函数也可以定义于可类型 可以直接在扩展函数内部处理情况 fun String?....= null s.printDefault("123") } 3.infix infix适用于单个入参扩展函数,可以使语法更简洁,调用方法.和()都可以去除 infix fun String...直接使用T.getInfo()就可以实现 2.作用域可以直接使用接收者函数和属性,也是扩展特性,反观下我们上面写扩展中,函数里使用this就是接收者,所以扩展函数中,可以直接使用接收者函数和属性

31520

【Kotlin】扩展函数 ( 扩展函数声明 | 调用方式 | 与成员函数优先级 | 接收者值处理 )

调用接收者类型对象成员 : 函数体中使用 this 关键字 , 可以调用接收者类型对象中成员 , 如在下面的示例中 , 类外部扩展函数中 , 调用 Student 对象中 name 成员 ,...扩展函数 成员函数 优先级 代码示例 : ① 代码示例 : 接收类型 Student 扩展函数函数签名与成员函数都是 print(num : Int) , 成员函数优先级高于扩展函数 , 因此调用该方法签名方法时...值处理两种类型 : ① 非类型 : 这是 Kotlin 默认类型 , 如 Student 类型是非类型 , 不能被赋值为 null ; ② 可类型 : 类型名称后使用 ?...修饰 , 就是可类型 , 如 Student? 类型是可类型 , 该类型可以被赋值成 null ; 2 ....可接收者类型扩展函数 : ① 可类型 : 一般情况下 , 扩展函数接收者不能为 , 也可以将接收者类型设置为可类型 ; ② 扩展函数中判 : 如果接收者类型可以为 , 那么尽量扩展函数中进行判空处理

71430

《Go 语言程序设计》读书笔记(四)接口

T类型变量上调用一个 *T方法是合法,编译器隐式获取了它地址。但这仅仅是一个语法糖:T类型值不拥有所有*T指针方法。...,所以调用了 (*bytes.Buffer).Write方法,并且接收者是该缓冲区地址。...动态分配机制依然决定 (*bytes.Buffer).Write方法会被调用,但是这次接收者值是nil。...对于一些如 *os.File类型,nil是一个有效接收者(§6.2.1),但是 *bytes.Buffer类型不在这些类型中。这个方法会被调用,但是当它尝试去获取缓冲区时会发生panic。...特别是这个调用违反了 (*bytes.Buffer).Write方法接收者隐含先觉条件,所以将nil指针赋给这个接口是错误

35920

【Kotlin】扩展函数 ② ( 扩展属性 | 为可类型定义扩展函数 | 使用 infix 关键字修饰单个参数扩展函数简略写法 )

; 注意下面的调用细节 : 如果定义 扩展函数 是 为 非类型定义 , 可类型变量 想要调用该 扩展函数 , 调用时使用 " ?....非类型扩展函数 如果定义 扩展函数 是为 可类型定义 , 可类型变量 想要调用该 扩展函数 , 调用时直接使用 " . " 进行调用即可 ; 可类型实例对象.可类型扩展函数 代码示例...addStr(str: String): String { if (this == null) { println("this = $this, string = $str, 接收者...= abc, 接收者不为 123abc this = null, string = abc, 接收者 abc 三、使用 infix 关键字修饰单个参数扩展函数简略写法 ---- 如果 扩展函数...只有 一个参数 , 并且 扩展函数 定义时 使用了 infix 关键字修饰 , 调用该扩展函数时 , 可以省略 接收者与函数之间点 和 参数列表括号 ; 调用 使用 infix 关键字修饰

1.9K30

干货 | Kotlin超棒语言特性

为了获得更好安全,Kotlin中所有的对象都明确指明可或者非属性,即这个对象是否可能为null。 ? 对于可类型对象,直接调用其方法,在编译阶段就会报错。...如下述代码,前面三个分支条件分别是:1、变量[1, 10]区间内, 2、变量x不在[10, 20]区间内,3、变量x是一个字符串。...其中MutableList就是这个扩展函数接收者。值得注意是,Kotlin允许这个接收者null,这样我们可以写出一些Java里面看似不可思议代码。...从这个方法定义我们可以看到,这个方法是对Any类进行扩展,而接收者类型后面加了个?号,所以准确来说,是对Any?类进行扩展。...我们看到,扩展函数一开始就对接收者进行判,若为null,则直接返回 “null” 字符串。

1.4K40

Kotlin概述与Java比较

Kotlin系统中,系统只拒绝编译尝试分配或返回null代码考虑以下示例 – 代码审查不是问题 – 科特林更注重可读性语法,所以代码审查不是一个问题,它们仍然可以由那些不熟悉语言团队成员完成...Kotlin语言特点 十亿美元错误是正确。 如上所述,Kotlin避免了指针异常。 如果我们尝试分配或返回null到变量或函数,那么它将不会编译。...考虑以下示例 – 你也可以喜欢Docker和Kubernetes上部署Kotlin应用程序 Kotlin和Java之间区别 安全 Null Safety– 如上节所述,Kotlin...以下为MutableList 添加交换函数 – 扩展功能中“this”关键字对应于接收者对象,即在点之前传递对象。...Lambda表达示例 – 在上面的例子中,我们简单地声明一个变量’sum’,它需要两个整数,并将它们加在一起,并返回total作为一个整数。 然后我们使用’sum(2,2)’来调用它。

3K10

Java 中 null 到底是什么?

Java 中,null 是一个非常常见关键字,用于表示“没有值”或“”。然而,对于初学者来说,null 本质可能会感到有些困惑。...本文中,我们将详细探讨 null Java 中含义和使用。图片null 定义 Java 中,null 表示“没有值”或“”。它是一个关键字,用于表示一个对象变量不引用任何对象。...这意味着该变量没有指向任何有效内存地址,因此它不指向任何对象。如果尝试 null 引用上调用任何方法或字段,则会引发 NullPointerException 异常。...以下是一些常见问题:1. 可能引发 NullPointerException如果尝试 null 引用上调用任何方法或字段,则会引发 NullPointerException 异常。...这可以在编译时很难发现,因此需要小心处理 null 引用。2. 可能导致代码复杂性使用 null 时,可能需要添加一些额外逻辑来检查是否为。这可能会使代码变得更加复杂,并增加错误机会。3.

79700

Go语言:理解函数、方法和指针

Go语言中,函数和方法都是可执行代码块,但它们有一个重要区别:函数是独立,而方法是依赖于特定类型。此外,Go语言还对方法接收者类型(值类型或指针类型)有独特处理,这是本文重点。...值接收者 当一个方法有值接收者时,每次方法调用都会复制一份接收者值。我们可以方法内部更改这个复制值,但原始值不会改变。...指针接收者 当一个方法有指针接收者时,方法调用会直接使用接收者实际值(不进行复制)。因此,我们可以方法内部更改这个值状态。...然而,这个自动转换并不改变方法是值接收者还是指针接收者,也就是说,即使你可以用一个值来调用指针接收者方法,如果你方法内部更改了这个值状态,原始值也不会改变,因为方法依然使用了副本。...fmt.Println(ms.Val) // 输出:10 ms2 := MyStruct{5} ms2.setValue(10) // 这里实际上调是 (&ms2).

14310

Android深入四大组件(四)广播注册、发送和接收过程

注释1处判断如果LoadedApk类型mPackageInfo不等于null并且context不等null就调用注释2代码通过mPackageInfogetReceiverDispatcher...注释1处获取ReceiverList列表,如果为则在注释2处创建,ReceiverList继承自ArrayList,用来存储广播接收者。...verifyBroadcastLocked方法主要是验证广播是否合法,注释1处验证intent是否不为null并且有文件描述符。注释2处获得intent中flag。...我们再回到broadcastIntent方法注释2处调用了broadcastIntentLocked方法,代码如下所示。...handleMessage方法中调用了processNextBroadcast方法,processNextBroadcast方法对无序广播和有序广播分别进行处理,旨在将广播发送给广播接收者,下面给出processNextBroadcast

73960

避开NullPointerException10条建议

概述 6 个可能发生情况: 对象上调用实例方法。...对空对象调用静态方法或类方法时,不会报 NPE,因为静态方法不需要实例来调用任何方法; 访问或更改对象上任何变量或字段时; 抛出异常时抛出 null; 数组为 null 时,访问数组长度; 数组为...(1)尽量避免未知对象上调用 equals() 方法和 equalsIgnoreCase() 方法,而是已知字符串常量上调用 由于 equals() 和 equalsIgnoreCase() 具有对称性...、字段、参数之上,表示对应值不可以为 @Nullable可以标注方法、字段、参数之上,表示对应值可以为 以上两个注解程序运行过程中不会起任何作用,只会在IDE、编译器、FindBugs检查...是不是很眼熟,这和我们第 8 点说对象模式类似, Optional 实现中也采用了这种模式。 (10)细心 嘿嘿,凑个第十点吧。

2K30
领券