首页 > 解决方案 > 为什么 Kotlin/Java 函数在实际使用中与文档看起来如此不同?

问题描述

例如这里是all()在行动:

fun Shop.checkAllCustomersAreFrom(city: City): Boolean =
    customers.all { it.city == city }

这是kotlin 文档中的等价物:

inline fun <T> Iterable<T>.all(
    predicate: (T) -> Boolean
): Boolean

有人可以解释第二个代码块的每个部分以及为什么这样写吗?

抱歉,如果这是一个基本问题,但如果我了解这一点,阅读文档会容易得多。

标签: kotlin

解决方案


让我们分解一下,好吗?

inline fun <T> Iterable<T>.all(predicate: (T) -> Boolean): Boolean
|--1--|-2-|-3-|-----4-----|-5-|----6-----|------7-------|----8----|
  1. 这个函数是内联的。这意味着它的主体本质上在编译时被复制粘贴到调用站点,作为一种优化措施(在这种情况下使用,因为它有一个 lambda 参数)。
  2. 声明一个函数。
  3. 类型参数列表,这个函数有一个泛型类型参数叫做T.
  4. 这是一个扩展函数,这是它的接收者,即被扩展的类型。这个函数可以在任何对象上调用,就Iterable<T>好像它是一个成员函数一样。它被调用的Iterable可以在函数体内作为this.
  5. 函数的名称。
  6. 函数的第一个也是唯一一个参数的名称(如果我们不计算接收者,这在技术上也是一个参数)。
  7. 函数参数的类型。这是一个函数类型,它描述了一个接受单个T参数并返回一个Boolean. 这可以是对具有此签名的常规函数​​的引用,但是对于诸如此类的集合函数的期望是,大多数时候这将是一个lambda
  8. 函数的返回类型。

推荐阅读