kotlin - 为什么 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
有人可以解释第二个代码块的每个部分以及为什么这样写吗?
抱歉,如果这是一个基本问题,但如果我了解这一点,阅读文档会容易得多。
解决方案
让我们分解一下,好吗?
inline fun <T> Iterable<T>.all(predicate: (T) -> Boolean): Boolean
|--1--|-2-|-3-|-----4-----|-5-|----6-----|------7-------|----8----|
- 这个函数是内联的。这意味着它的主体本质上在编译时被复制粘贴到调用站点,作为一种优化措施(在这种情况下使用,因为它有一个 lambda 参数)。
- 声明一个函数。
- 类型参数列表,这个函数有一个泛型类型参数叫做
T
. - 这是一个扩展函数,这是它的接收者,即被扩展的类型。这个函数可以在任何对象上调用,就
Iterable<T>
好像它是一个成员函数一样。它被调用的Iterable
可以在函数体内作为this
. - 函数的名称。
- 函数的第一个也是唯一一个参数的名称(如果我们不计算接收者,这在技术上也是一个参数)。
- 函数参数的类型。这是一个函数类型,它描述了一个接受单个
T
参数并返回一个Boolean
. 这可以是对具有此签名的常规函数的引用,但是对于诸如此类的集合函数的期望是,大多数时候这将是一个lambda。 - 函数的返回类型。
推荐阅读
- c++ - C++ GetProcessTimes() 不会随时间改变值
- ios - Swift:为一个控制器启用横向,其余为纵向
- shell - 如何在带有别名的bashrc中使用后台执行?
- python - Python/Django 递归模型到树结构字典中
- firebase - 如何在不更改 Firebase 身份验证中的 UID 的情况下更改用户的登录方法?
- javascript - 如何将一个url的值作为Angular中的参数传递给另一个url
- elasticsearch - 从 h2o 导入 Opendsitro JDBC 索引表
- angular - 使用 Angular 在 ionic 4 中关闭应用程序的正确方法是什么?
- r - 带有详细边界的Choropleth地图
- javascript - 在 WordPress 中,如何为小屏幕提供不同的图像源?