【发布时间】:2018-10-30 13:45:09
【问题描述】:
高阶函数的参数是任意一个
- 函数类型或
- 带接收器的函数类型。
我们习惯了filter和with来自kotlin的stdlib:
@Test
fun `filter example`() {
val filtered = listOf("foo", "bar").filter {
it.startsWith("f")
}
assertThat(filtered).containsOnly("foo")
}
@Test
fun `with example`() {
val actual = with(StringBuilder()) {
append("foo")
append("bar")
toString()
}
assertThat(actual).isEqualTo("foobar")
}
filter 使用函数类型参数,with 使用带有接收器的函数类型参数。所以传递给filter 的lambdas 使用it 来访问iterable 的元素,而传递给with 的lambdas 使用this 来访问StringBuilder。
我的问题:当我声明自己的高阶函数时,是否有经验法则,使用哪种样式(it vs this)?
换句话说: 为什么过滤不是这样设计的?
inline fun <T> Iterable<T>.filter2(predicate: T.() -> Boolean): List<T> = filter { it.predicate() }
如果它是这样定义的,我们会这样使用它:
@Test
fun `filter2 function type with receiver`() {
val filtered = listOf("foo", "bar").filter2 {
// note: no use of it, but this
startsWith("f")
}
assertThat(filtered).containsOnly("foo")
}
【问题讨论】:
-
第一个是lamabda,第二个是带有接收器的lambda。
标签: lambda kotlin functional-programming