前言

经过前面对 Kotlin 的介绍,相信大家已经能对 Kotlin 有了一个基本的认识。 从这节开始,我就为大家讲解 Kotlin的方法以及Lambda表达式等高级操作。

一、Kotlin的方法

1、方法声明

fun functionLearn(days: Int): Boolean {
 return days > 100
}

成员方法

//成员方法
class Person {
 fun test1() {
 println("成员方法")
 }
}
Person().test1()

类方法

Kotlin 中并没有 static 关键字,不过我们可以借助 companion object 来实现 类方法的目的。

(1)companion object 实现的类方法

class Person {
 companion object {
 fun test2() {
 println("companion object 实现的类方法")
 }
 }
}
Person.test2()

(2)静态类

如果我们想实现一个工具 util 的话,可以借助 object 来创建一个静态类:

/**
* 整个静态类
*/
object NumUtil {
 fun double(num: Int): Int {
 return num * 2
 }
}

(3)全局静态

我们可以直接新建一个 Kotlin file 然后定义一些常量、方法。

单表达式方法

当方法返回单个表达式时,可以省略花括号并且在 = 符号之后指定代码体即可:

fun double(x: Int): Int = x * 2

当返回值类型可由编译器推断时,显式声明返回类型是可选的:

fun double(x: Int) = x * 

2、方法参数

默认参数

方法参数可以有默认值,当省略相应的参数时使用默认值。与其 Java 相比, 这可以减少重载数量:

fun read(b: Array<Byte>, off: Int = 0, len: Int = b.size) { /*……*/ }

我们可以通过类型后面的 = 来设置默认值。

如果一个默认参数在一个无默认值的参数之前,那么该默认值只能通过使用 具名参数调用该方法 来使用:

fun foo(bar: Int = 0, baz: Int) { /*……*/ }
foo(baz = 1) // 使用默认值 bar = 0

如果在默认参数之后的最后一个参数是 lambda 表达式,那么它既可以作为 具名参数在括号内传 入,也可以在括号外传入:

fun foo(bar: Int = 0, baz: Int = 1, qux: () -> Unit) { /*……*/ }
foo(1) { println("hello") } // 使用默认值 baz = 1
foo(qux = { println("hello") }) // 使用两个默认值 bar = 0 与 baz = 1
foo { println("hello") } // 使用两个默认值 bar = 0 与 baz = 1

可变数量的参数

方法的参数(通常是最后一个)可以用 vararg 修饰符标记:

fun append(vararg str: Char): String {
 val result = StringBuffer()
 for (char in str) {
 result.append(char)
 }
 return result.toString()
}

允许将可变数量的参数传递给方法:

append('h', 'e', 'l', 'l', 'o')

可变参数的要求:

• 只有一个参数可以标注为 vararg;

• 如果 vararg 参数不是列表中的最后一个参数, 可以使用具名参数语 法传递其后的参数的 值,或者,如果参数具有方法类型,则通过在括 号外部传一个 lambda。

当我们调用 vararg 方法时,我们可以一个接一个地传参,例如 append('h', 'e', 'l', 'l', 'o'),或者,如果我们已经有一个数组并希望将其内容传给该方法, 我们使用伸展(spread)操作符(在数组前面加 *):

val world = charArrayOf('w', 'o', 'r', 'l', 'd')
val result = append('h', 'e', 'l', 'l', 'o',' ', *world)

3、方法作用域

在 Kotlin 中方法可以在文件顶层声明,这意味着你不需要像一些语言如 Java、C# 那样需要创建一个类来保存一个方法。 此外除了顶层方法, Kotlin 中方法也可以声明在局部作用域、作为成员方法以及扩展方法。

局部方法

Kotlin 支持局部方法,即一个方法在另一个方法内部:

fun magic(): Int {
 fun foo(v: Int): Int {
 return v * v
 }
 val v1 = (0..100).random()
 return foo(v1)
}

局部方法可以访问外部方法(即闭包)的局部变量。

二、Lambda表达式

在 Java 8 的时候开始支持 Lambda 表达式,目前 Lambda 语法在 Java 中已 经被广泛的运用,Lambda 表达式可以理解为是一种语法糖,值得庆幸的 是,Kotlin 一经开源成熟就已经支持这种语法。

Lambda 表达式的本质其实是匿名方法,因为在其底层实现中还是通过匿名 方法来实现的。但是我们在用的时候不必关心起底层实现。不过 Lambda 的 出现确实是减少了代码量的编写,同时也是代码变得更加简洁明了。

Lambda 作为方法式编程的基础,其语法也是相当简单的。这里先通过一段 简单的代码演示没让大家了解 Lambda 表达式的简洁之处:

view.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 Toast.makeText(v.getContext(), "Lambda 简洁之道",
Toast.LENGTH_LONG).show();
 }
});

VS

view.setOnClickListener { v -> Toast.makeText(v.context, "Lambda 简洁之道
", Toast.LENGTH_LONG).show() }

1、Lambda表达式的特点

语法如下:

无参数的情况 :

val/var 变量名 = { 操作的代码 }

有参数的情况:

val/var 变量名 : (参数的类型,参数类型,...) -> 返回值类型 = {参数 1,参数
2,... -> 操作参数的代码 }

可等价于

// 此种写法:即表达式的返回值类型会根据操作的代码自推导出来。
val/var 变量名 = { 参数 1 : 类型,参数 2 : 类型, ... -> 操作参数的代码 }

lambda 表达式作为方法中的参数的时候,这里举一个例子:

fun test(a : Int, 参数名 : (参数 1 : 类型,参数 2 : 类型, ... ) -> 表达式返回
类型){
 ...
}

2、Lambda实践

如何使用 it

认识 it

• it 并不是 Kotlin 中的一个关键字(保留字)

• it 是在当一个高阶方法中 Lambda 表达式的参数只有一个的时候可以使用 it 来使 用此参数

• it 可表示为单个参数的隐式名称,是 Kotlin 语言约定的

• 实例 A:单个参数的隐式名称

// 这里举例一个语言自带的一个高阶方法 filter,此方法的作用是过滤掉不满足条
件的值。
val arr = arrayOf(1,3,5,7,9)
// 过滤掉数组中元素小于 2 的元素,取其第一个打印。这里的 it 就表示每一个元
素。
println(arr.filter { it < 5 }.component1())
//结合上文的
testClosure(1)(2) {
println(it)
}

如何使用下划线_

在使用 Lambda 表达式的时候,可以用下划线(_)表示未使用的参数,表示不 处理这个参数。

在遍历一个 Map 集合的时候,这当非常有用

val map = mapOf("key1" to "value1", "key2" to "value2", "key3" to
"value3")
map.forEach { (key, value) ->
 println("$key \t $value")
}
// 不需要 key 的时候
map.forEach { (_, value) ->
 println(value)
}

总结

本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

到此这篇关于Kotlin方法与Lambda表达式实践使用介绍的文章就介绍到这了,更多相关Kotlin方法与Lambda表达内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Kotlin方法与Lambda表达式实践使用介绍的更多相关文章

  1. ios – 如何使用Magical Record创建和更新对象并保存它们而不使用contextForCurrentThread

    解决方法所以,我使用客观C而不是RubyMotion,但你应该能够这样做:编辑如果要稍后保存上下文,您只需要坚持下去:这里的主要思想是,您只需要掌握上下文并在准备就绪时执行您的操作.如果要进行后台保存,请使用以下方法:

  2. OC的Block、Swift的Closure及C#的Lambda对比

    Block:代码块、语法糖、对象Closure:闭包、自包含模块、捕获前后变量处理逻辑Lambda:可用于创建委托或表达式目录树类型的匿名函数Lambda运算符=>的左边列出了需要的参数,右边定义了赋予Lambda变量方法的实现代码。

  3. Kotlin难点解析:extension和this指针

    扩展是Kotlin语言中使用非常简单的一个特性。关于这个问题,其实我之前的一篇文章[[Kotlin]LambdaandExtension](https://www.jianshu.com/p/d7a...中有提到过。为了解决这个问题,官方提出了两个新的概念:dispatchreceiver和extensionreceiver。extensionreceiver:中文翻译为扩展接收者。为了简化,这里我们将dispatchreceiver简称为DR,将extensionreceiver简称为ER。如果你习惯了

  4. Android Studio重构还原所有lambda和其他Java 8功能

    AndroidStudioIDE中是否内置了此类功能?解决方法您可以通过将光标置于–>内来替换lambda.然后按AltEnter然后选择“用……替换lambda”您可以通过展开菜单并选择“修复所有…”来对整个文件执行此操作.您可以按照上述步骤在整个项目中执行此操作,而是单击“运行检查…”选择“整个项目”检查完成后,右键单击“Lambda可以替换…”部分并选择“将lambda替换为……”

  5. android – Kotlin类NoClassDefFoundError崩溃

    我有一个使用以下库的现有Android项目:>Autovalue>Dagger2>RxJava>Retrolambda我正在尝试添加Kotlin支持,以便我可以将项目慢慢迁移到Kotlin.这就是我所做的.>添加了Kotlin依赖.>将其中一个类转换为Kt类并转移到src/main/kotlin/..包中.>在源集中添加了kotlin.sourceSets{main.java.srcDirs=’s

  6. android – lambda表达式未使用

    lambda表达式如何未使用?

  7. android – Kotlin和Dagger2

    我正在尝试将Kotlin添加到我的项目中,但在启用Kotlin之后我无法构建,因为Dagger2类不再生成.我尝试了第二个项目,我有同样的问题.这些是我为启用Kotlin所做的改变:项目build.gradle:Appbuild.gradle:错误发生在这里:其中不再定义DaggerObjectGraph.任何帮助将不胜感激.解决方法只需删除

  8. android – 在Kotlin中不能使用argb color int值吗?

    当我想在Kotlin中为TextView的textColor设置动画时:发生此错误:似乎在Kotlin中不能将值0xFF8363FF和0xFFC953BE强制转换为Int,但是,它在Java中是正常的:有任何想法吗?提前致谢.解决方法0xFF8363FF是Long,而不是Int.你必须明确地将它们转换为Int:关键是0xFFC953BE的数值是4291384254,因此它应该存储在Long变量中.但这里的高位是符号位,表示负数:-3583042,可以存储在Int中.这就是两种语言之间的区别.在Kotlin

  9. 什么是我可以使用Kotlin的最早的Android API级别?

    我认为这个问题很清楚但是我能在Kotlin上定位的最早API级别是什么?解决方法实际上,任何API级别.这是因为Kotlin被编译为JVM6平台的字节码,所有AndroidAPI级别都支持该字节码.因此,除非您在Kotlin代码中使用任何较新的AndroidAPI,否则它不需要任何特定的API级别.

  10. android – Kotlin数据类和可空类型

    我是Kotlin的新手,我不知道为什么编译器会抱怨这段代码:编译器抱怨测试?.data.length,它说我应该这样做:test?.length.但是数据变量是String,而不是String?,所以我不明白为什么我要把它?当我想检查长度.解决方法表达式test?.data部分可以为空:它是test.data或null.因此,获取其长度并不是零安全的,而是应该再次使用safecalloperator:test?.length.可空性通过整个调用链传播:你必须将这些链写成?.)).e),因为,如果其中一个左

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部