Scala中高阶函数入参p:A=>Boolean的更优实现方法
场景说明
你实现了一个接收判定函数作为入参的泛型高阶函数findFirst,功能是遍历数组返回第一个满足判定条件的元素下标,遍历完未找到则返回-1,实现代码如下:
def findFirst[A](ss:Array[A], p:A=>Boolean):Int ={ @tailrec def loop(n:Int):Int ={ if(p(ss(n))) n else if (n+1>=ss.length) -1 else loop(n+1) } loop(0) }
当前你通过显式编写完整匿名函数的方式传入判定参数p完成调用:
println(findFirst(Array(6, 1,2,3,4,5,6) ,(a:Int)=> a.equals(6)))
以下是几种实现入参p的更简洁、更符合Scala编码习惯的方式。
优化写法
- 省略匿名函数的参数类型标注
Scala支持根据高阶函数的上下文自动推断参数类型,由于你传入的第一个参数是Array[Int],编译器可以自动推断出判定函数p的入参类型为Int,不需要手动标注,写法可以直接简化为:findFirst(Array(6,1,2,3,4,5,6), a => a.equals(6)) - 使用Scala原生相等判断简化逻辑
Scala中==运算符默认就是按值相等判断(等价于Java里的equals,还额外做了null安全处理),不需要手动调用equals方法,代码可以进一步简化:findFirst(Array(6,1,2,3,4,5,6), a => a == 6) - 用下划线语法糖写最简匿名函数
当匿名函数的参数在函数体中只按顺序出现一次时,可以直接用_作为通配符替代参数名,这是Scala中最简洁的匿名函数写法,最终调用代码可以简化为:
这种写法对其他单参数判定逻辑同样适用,比如查找第一个大于3的元素下标:println(findFirst(Array(6, 1,2,3,4,5,6), _ == 6))findFirst(Array(6,1,2,3,4,5,6), _ > 3)
注意:如果判定逻辑比较复杂,参数需要在函数体中多次引用,或者包含多步计算,不建议使用下划线语法,此时使用带命名参数的普通匿名函数可读性更好。
内容的提问来源于stack exchange,提问作者GPopat
相关产品推荐
相关产品推荐

