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


















![[02/27][官改] Simplicity@MIX2 ROM更新-一一网](https://www.proyy.com/wp-content/uploads/2020/02/3168457341.jpg)


![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)
![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)
