Situation(背景)
Target(目标)
完成题目,输出解题思路。
Action(行动/做法)
题解
非常简单的题目,就是一个过滤的事情,使用Kotlin的filter函数解决。
class Solution {
fun removeVowels(s: String): String {
return s.filter{
it != 'a' && it != 'e' && it != 'i' && it != 'o' && it != 'u'
}
}
}
复制代码
分析
题目本身没什么好说的,但可以分析下filter
源码本身。
public inline fun String.filter(predicate: (Char) -> Boolean): String {
return filterTo(StringBuilder(), predicate).toString()
}
复制代码
可以看到filter
是String
的一个扩展函数,其入参数是一个函数(入参Char
,返回Boolean
),函数本身返回String
。
基于带有接收者的函数字面值描述,这还是一个能在{}
体里,直接用this访问调用者的函数,那么其本质调用如下:
public inline fun String.filter(predicate: (Char) -> Boolean): String {
return this.filterTo(StringBuilder(), predicate).toString()
}
复制代码
先继续看filterTo
public inline fun <C : Appendable> CharSequence.filterTo(destination: C, predicate: (Char) -> Boolean): C {
for (index in 0 until length) {
val element = get(index)
if (predicate(element)) destination.append(element)
}
return destination
}
复制代码
一样的道理,里面省略了很多调用者的描述this
,也就是前面filter
的调用者String
对象。
接着会根据predicate
来过滤元素,最终返回filter
里的StringBuilder()
。
不难看出,filter
是没做字符串拼接的,所以性能上也没有问题。
Result(结果)
完成题目,总结:
题目本身很简单,但kotlin本身对特殊用法还是很方便的。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END