博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Kotlin】—— 函数字面值(量)补充
阅读量:3565 次
发布时间:2019-05-20

本文共 1233 字,大约阅读时间需要 4 分钟。

之前在学习 Kotlin 的时候,有整理了一篇关于 的博客。然后今天再回顾相关知识点的时候,感觉对这个概念加深了一点理解,而且之前那篇文章可能说得不太明白,于是这里又整理下相关的想法,做一个补充,希望能够帮助大家更加通俗的理解这个概念。

首先,函数字面值(量)即一段函数文本,说白了就是一段代码,可以当作参数来传递


比如下面的:

var tmp: ((Int) -> Boolean)? = null

定义了一个变量 tmp,而该变量的类型就是 (Int) -> Boolean 这一函数类型(可为空的),该类型的函数,需要传递一个 Int 类型的参数,返回 Boolean 类型的值。

这就跟下面的是类似

var tmp2: String? = null

定义一个变量 tmp2,而该变量的类型就是 String 类型,即字符串类型。

当然, tmp 暂时只是定义了类型,然后如果给它赋值的话,可以是:

// 1-1// num 即对应 Int 类型的参数,(num>10) 是一个表达式,对应着 Boolean 类型的返回值tmp = {
num -> (num > 10) }

此时,num -> (num > 10) 即是一个函数字面值,或者说,这个函数字面值即指的是 num -> (num > 10)

(题外话,如果函数只有一个参数的话,则该参数可以省略,默认以 it 关键字代替)

在这里插入图片描述

当然,tmp 的具体实现是不定的,可以是上面写的那样,也可以是:

// 2-1tmp = {
num -> (num >= 0) }

这里就对应另外一种函数字面值了。

以上说到的两种不同的函数字面值,他们唯一的共同点就是属于 (Int) -> Boolean 类型。

接下来还有一点,既然是变量,就可以作为方法参数传递,比如我定义一个方法:

fun method(a: ((Int) -> Boolean)?) {
val b = a?.invoke(3) println(b)}

该方法的参数 a 同样也是 (Int) -> Boolean 这一函数类型,因此,在使用该 method() 方法时,就可以传递之前的两种函数字面值,即 1-11-2 两种不同的函数字面值。然后通过 invoke() 来触发其执行,当然,需要传递一个 Int 类型的参数。

// 2-1method({
num -> (num > 10) })// 2-2method({
num -> (num >= 0) })

对于 1-1 对应的函数字面量,其执行结果就为 false,即会打印 fasle;

对于 1-2 对应的函数字面量,其执行结果就为 true,即会打印 true;


类比到 Java 中,其实就类似于定义一个只有一个方法的接口,前面说的 “函数类型” 即对应该接口类型,而函数字面值,则对应着接口方法的具体实现。

转载地址:http://nrerj.baihongyu.com/

你可能感兴趣的文章
C++ set容器(附代码)
查看>>
连通分量 Aizu - ALDS1_11_D Connected Components dfs或bfs或并查集
查看>>
Leetcode 验证二叉搜索树
查看>>
Leetcode 二叉树的最大深度
查看>>
Leetcode 对称二叉树 判定
查看>>
Leetcode 二叉树的层次遍历 队列的应用
查看>>
Leetcode 路径总和 dfs
查看>>
Leetcode 已知前序(后序)遍历和中序遍历构建二叉树
查看>>
HDU 1269 迷宫城堡 两次dfs
查看>>
Div3 506 A. Many Equal Substrings
查看>>
Leetcode 100. 相同的树 dfs
查看>>
Leetcode 111. 二叉树的最小深度 dfs
查看>>
Leetcode 110. 平衡二叉树 dfs
查看>>
Leetcode 113. 路径总和 II dfs
查看>>
Leetcode 107. 二叉树的层次遍历 II 队列+栈的应用
查看>>
Leetcode 127. 单词接龙 bfs
查看>>
Leetcode 315. 计算右侧小于当前元素的个数 线段树
查看>>
Leetcode 118 寻找峰值
查看>>
Leetcode 22. 括号生成 dfs+回溯
查看>>
Leetcode 39. 组合总和
查看>>