函数是一等公民
最后更新于:2022-04-01 23:05:41
### 一个需求
* 假设我们需要检查许多的数字是否符合某一范围
* 范围存储在外部系统中,并且可能随时更改
* 数字范围像这样存储着”>= 3,< 7”
一个java版本
~~~
List params = new LinkedList<>();
List nums = new LinkedList<>();
List marks = new LinkedList<>();
public JavaRangeMatcher(List params) {
this.params = params;
for (String param : params) {
String[] markNum = param.split(" ");
marks.add(markNum[0]);
nums.add(Integer.parseInt(markNum[1]));
}
}
public boolean check(int input) {
for (int i = 0; i < marks.size(); i++) {
int num = nums.get(i);
String mark = marks.get(i);
if (mark.equals(">") && input <= num) return false;
if (mark.equals(">=") && input < num) return false;
if (mark.equals("<") && input >= num) return false;
if (mark.equals("<=") && input > num) return false;
}
return true;
}
List paramsList = new LinkedList() {{
add(“>= 3”);
add(“< 7”);
}};
JavaRangeMatcher matcher = new JavaRangeMatcher(paramsList);
int[] inputs = new int[]{1, 3, 5, 7, 9};
for (int input : inputs) {
System.out.println(matcher.check(input));
}
//给自己有限的时间,想想又没有性能优化的余地
//我们一起来跑跑看
~~~
一个 scala 版本
~~~
def exprToInt(expr: String): Int => Boolean = {
val Array(mark, num, _*) = expr.split(" ")
val numInt = num.toInt
mark match {
case "<" => numInt.>
case ">" => numInt.<
case ">=" => numInt.<=
case "<=" => numInt.>=
} //返回函数的函数
}
case class RangeMatcher(range: Seq[String]) {
val rangeFunc: Seq[(Int) => Boolean] = range.map(exprToInt)
def check(input: Int) = rangeFunc.forall(_(input))
}
def main(args: Array[String]) {
val requirements = Seq(">= 3", "< 7")
val rangeMatcher = RangeMatcher(requirements)
val results = Seq(1, 3, 5, 7, 9).map(rangeMatcher.check)
println(results.mkString(","))
//false,true,true,false,false
}
~~~
';