kotlin的list操作中有个getOrElse函数,看不懂lambda是什么意思

caibirdcnb 2021-05-20 12:08:22

函数作用如下面:
getOrElse() 提供用于计算默认值的函数,如果集合中不存在索引,则返回默认值。

函数使用示例:
val numbers = listOf('1', '2', '3', '4')
println(numbers.getOrElse(6, {'c'}))

getOrElse()的实现:
inline fun <T> List<T>.getOrElse(
index: Int,
defaultValue:(Int) -> T //这个 (Int) -> T 看不明白
): T

我的问题是:这个lambda表达式(Int) -> T是什么意思?
我一开始的理解是接收一个方法,输入Int类型参数,输出T类型。
但是,在上面示例中,{'c'}是字符不是Int类型啊?
谢谢
...全文
22613 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
caibirdcnb 2021-05-24
  • 打赏
  • 举报
回复
引用 7 楼 立青_ 的回复:
这是个方法呀,kotlin可以将方法作为参数。(Int) -> T表示这个方法接收int类型参数,返回值类型为T,defaultValue(index)就是执行他传过来的方法,传入的参数是index [quote=引用 6 楼 caibirdcnb 的回复:][quote=引用 5 楼 立青_ 的回复:]这是个方法呀,kotlin可以将方法作为参数。(Int) -> T表示这个方法接收int类型参数,返回值类型为T,defaultValue(index)就是执行他传过来的defaultValue方法,传入的参数是index
是啊,这又回到我主贴的问题了。我最初的理解和你说的一样,但是,你看下面的{'c'},明显'c'是字符类型,而不是int类型啊。不是说这个方法接收int类型吗?为什么字符类型也可以啊? println(numbers.getOrElse(6, {'c'}))[/quote] 我前面说了那么多。你没明白吗?'c'不是参数,它是我传的这个方法的方法体啊!它完整的应该是
return 'c'
只是省略了retur而已,我给你写的
inline fun <T> List<T>.getOrElse(
    index: Int,
    defaultValue:(Int) -> T       //这个 (Int) -> T 看不明白
):T{
    return defaultValue(index)
}
defaultValue(index) 是在调用传过来的方法,传入的index才是参数,index是int型啊,按上面传过来的方法,defaultValue(index) 会得到'c',getOrElse方法此次返回的也是'c'[/quote] 终于明白了,非常感谢!
caibirdcnb 2021-05-22
  • 打赏
  • 举报
回复
引用 2 楼 立青_ 的回复:
这个‘c'是返回值,kotlin的lambda表达式中return可以省略掉。int是输入参数,getOrElse下面应该还有方法体没写全,最简单的就是
inline fun <T> List<T>.getOrElse(
    index: Int,
    defaultValue:(Int) -> T       //这个 (Int) -> T 看不明白
):T{
    return defaultValue(index)
}
defaultValue(index),这个index才是传入的int
我不明白的是defaultValue:(Int) -> T 中的(Int) -> T是什么意思。 例如, index: Int表示参数名字叫index,类型是Int。 但是,defaultValue:(Int) -> T 表示参数名字叫defaultValue,类型是(Int) -> T,但(Int) -> T是什么我看不懂。这才是我的问题,我想知道(Int) -> T表示什么意思。
caibirdcnb 2021-05-22
  • 打赏
  • 举报
回复
引用 1 楼 立青_ 的回复:
输出的是“T" 类型,也就是泛型,你这个集合的泛型不是字符? listOf('1', '2', '3', '4'),这不是字符是啥?
我知道'1', '2', '3', '4'是字符啊,但我的问题不是这个。 我的问题是:lambda表达式(Int) -> T是什么意思? 我一开始的理解是接收一个方法,输入Int类型参数,输出T类型。 但是,在示例中,numbers.getOrElse(6, {'c'})接收的{'c'}并不是(Int)啊?
立青_ 中级 2021-05-22
  • 打赏
  • 举报
回复
val numbers = listOf('1', '2', '3', '4')
        println(numbers.getOrElse(6) {
            when (it) {
                1 -> 'a'
                2 -> 'c'
                else -> 'z'
            }
        })


inline fun <T> List<T>.getOrElse(
    index: Int,
    defaultValue: (Int) -> T
): T {
    if (index in 0 until size) {
        return this[index]
    }
    return defaultValue(index)
}
给你写个稍微复杂一点的,getOrElse接收一个int和一个方法(这个方法接收一个int返回类型是泛型),如果传入的int在集合范围内,就返回对应字符,否则调用传入的方法,返回其结果。 然后我调用getOrElse方法传入一个6,和一个方法,这个方法判断传入的参数,如果是1返回'a',是'2'返回'c',否则返回'z',此次我调用getOrElse传的是6,而numbers 的size是4,所以它会调用我传入的方法,最终结果应该是'z'
立青_ 中级 2021-05-22
  • 打赏
  • 举报
回复
'c'是返回值,不是传入的参数,此次泛型就是字符,返回‘c'完全没问题
立青_ 中级 2021-05-22
  • 打赏
  • 举报
回复
这是个方法呀,kotlin可以将方法作为参数。(Int) -> T表示这个方法接收int类型参数,返回值类型为T,defaultValue(index)就是执行他传过来的方法,传入的参数是index
引用 6 楼 caibirdcnb 的回复:
[quote=引用 5 楼 立青_ 的回复:]这是个方法呀,kotlin可以将方法作为参数。(Int) -> T表示这个方法接收int类型参数,返回值类型为T,defaultValue(index)就是执行他传过来的defaultValue方法,传入的参数是index
是啊,这又回到我主贴的问题了。我最初的理解和你说的一样,但是,你看下面的{'c'},明显'c'是字符类型,而不是int类型啊。不是说这个方法接收int类型吗?为什么字符类型也可以啊? println(numbers.getOrElse(6, {'c'}))[/quote] 我前面说了那么多。你没明白吗?'c'不是参数,它是我传的这个方法的方法体啊!它完整的应该是
return 'c'
只是省略了retur而已,我给你写的
inline fun <T> List<T>.getOrElse(
    index: Int,
    defaultValue:(Int) -> T       //这个 (Int) -> T 看不明白
):T{
    return defaultValue(index)
}
defaultValue(index) 是在调用传过来的方法,传入的index才是参数,index是int型啊,按上面传过来的方法,defaultValue(index) 会得到'c',getOrElse方法此次返回的也是'c'
caibirdcnb 2021-05-22
  • 打赏
  • 举报
回复
引用 5 楼 立青_ 的回复:
这是个方法呀,kotlin可以将方法作为参数。(Int) -> T表示这个方法接收int类型参数,返回值类型为T,defaultValue(index)就是执行他传过来的defaultValue方法,传入的参数是index
是啊,这又回到我主贴的问题了。我最初的理解和你说的一样,但是,你看下面的{'c'},明显'c'是字符类型,而不是int类型啊。不是说这个方法接收int类型吗?为什么字符类型也可以啊? println(numbers.getOrElse(6, {'c'}))
立青_ 中级 2021-05-22
  • 打赏
  • 举报
回复
这是个方法呀,kotlin可以将方法作为参数。(Int) -> T表示这个方法接收int类型参数,返回值类型为T,defaultValue(index)就是执行他传过来的defaultValue方法,传入的参数是index
立青_ 中级 2021-05-20
  • 打赏
  • 举报
回复
这个‘c'是返回值,kotlin的lambda表达式中return可以省略掉。int是输入参数,getOrElse下面应该还有方法体没写全,最简单的就是
inline fun <T> List<T>.getOrElse(
    index: Int,
    defaultValue:(Int) -> T       //这个 (Int) -> T 看不明白
):T{
    return defaultValue(index)
}
defaultValue(index),这个index才是传入的int
立青_ 中级 2021-05-20
  • 打赏
  • 举报
回复
输出的是“T" 类型,也就是泛型,你这个集合的泛型不是字符? listOf('1', '2', '3', '4'),这不是字符是啥?

80,469

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧