写在前面:一名有三年Android开发经验的女程序员(欢迎大家关注我 ~期待和大家一起交流和学习Android的相关知识)
这篇是@唐子玄写的~嘻嘻嘻
如果用代码实现择偶标准的判断逻辑,会很容易写出又臭又长的代码。本文通过 Kotin 独有的语法特性“约定”来增加代码的可读性、复用性。
业务场景
假设女生的择偶标准如下:未婚且岁数比我大,如果对方是本地帅哥则对收入降低标准(年薪>10万),如果对方非本地则要求岁数不能超过40岁,且年薪在40万以上。(BMI 在 20 到 25 之间的定义为帅哥)
业务分析
将候选人组织成列表,在候选人列表对象上调用filter()将筛选标准传入即可。
- 1 将候选人抽象成data类:
data class Human(
val age:Int, //年龄
val annualSalary:Int,//年薪
val nativePlace:String, //祖籍
val married:Boolean, //婚否
val height:Int,//身高
val weight:Int, //体重
val gender:String//性别
)
- 2 定义筛选函数
fun filterCandidate(man: List<Human>, women: Human, predicate: (Human, Human) -> Boolean) {
man.filter { predicate.invoke(it, women) }.forEach {
Log.v(“ttaylor”, “man = $it”)
}
}
函数接收三个参数:
- 1 man表示一组候选人
- 2 women表示客户
- 3 predicate表示该客户的筛选标准。
其中第三个参数的类型是函数类型,用一个 lambda (Human, Human) -> Boolean来描述,它表示该函数接收两个 Human 类型的输入并输出 Boolean。
函数体中调用了系统预定义的filter(),它的定义如下:
/**
* Returns a list containing only elements matching the given [predicate].
*/
public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {
//'构建空列表实例'
return filterTo(ArrayList<T>(), predicate)
}
/**
* Appends all elements matching the given [predicate] to the given [destination].
*/
public inline fun <T, C : MutableCollection<in T>> Iterable<T>.filterTo(destination: C, predicate: (T) -> Boolean): C {
//'遍历集合向列表中添加符合条件的元素'
for (element in this) if (predicate(element)) destination.add(element)
return destination
}
filter()接收一个函数类型参数predicate