为什么Kotlin / Java函数在实际使用中与文档看起来如此不同?

时间:2019-03-10 06:08:28

标签: kotlin

例如,这里有all()正在运行:

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

这是kotlin documentation中的等效内容:

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

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

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

2 个答案:

答案 0 :(得分:4)

让我们分解一下吧?

inline fun <T> Iterable<T>.all(predicate: (T) -> Boolean): Boolean
|--1--|-2-|-3-|-----4-----|-5-|----6-----|------7-------|----8----|
  1. 此功能为inline。这意味着its body essentially gets copy-pasted to the call site at compile time作为一种优化措施(在本例中使用,因为它具有lambda参数)。
  2. 声明一个函数。
  3. 类型参数列表,此函数具有一个称为T的通用类型参数。
  4. 这是extension function,这是它的接收者,即正在扩展的类型。该函数可以在任何Iterable<T>上调用,就好像它是成员函数一样。调用它的Iterable可以在函数体内以this的形式访问。
  5. 函数的名称。
  6. 该函数的第一个也是唯一一个参数的名称(如果我们不计算接收者,从技术上讲,它也是一个参数)。
  7. 函数参数的类型。这是function type,它描述了一个函数,该函数采用单个T参数,并返回一个Boolean。这可以是对具有此签名的常规函数​​的引用,但是对诸如此类的收集函数的期望是,在大多数情况下,这将是lambda
  8. 函数的返回类型。

答案 1 :(得分:1)

内联-将此函数的主体放在编译时而不是调用函数的地方。

乐趣-函数声明

-称为T的通用类型

可迭代-我们也添加了扩展功能。 (如果不是inline读取静态函数)

全部-函数名称

谓词-名为谓词的参数

:(T)->布尔值-Lambda类型将T作为参数并返回布尔值。通常采用{ it == foo }

的形式

:布尔值-返回布尔值