You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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中最简洁的匿名函数写法,最终调用代码可以简化为:
    println(findFirst(Array(6, 1,2,3,4,5,6), _ == 6))
    
    这种写法对其他单参数判定逻辑同样适用,比如查找第一个大于3的元素下标:
    findFirst(Array(6,1,2,3,4,5,6), _ > 3)
    

注意:如果判定逻辑比较复杂,参数需要在函数体中多次引用,或者包含多步计算,不建议使用下划线语法,此时使用带命名参数的普通匿名函数可读性更好。

内容的提问来源于stack exchange,提问作者GPopat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 05:57:26