Scala中函数捆绑:如何无显式参数调用多个函数?
解决方案:无显式参数合并多个Unit函数
好问题!确实可以去掉显式的参数i来实现同时执行sayHello和sayHi的逻辑,不过得用Scala的函数组合技巧——你之前的错误写法{ sayHello; sayHi }之所以只执行最后一个函数,是因为Scala的块表达式只会返回最后一个表达式的结果,这里的块最终返回的是sayHi这个函数本身,自然只会执行它。
下面是几种优雅的实现方式:
1. 使用andThen函数组合(推荐)
andThen是Scala函数的内置方法,专门用于链式组合函数:先执行第一个函数,再执行第二个函数,完美适配你的需求:
val bar: Int => Unit = sayHello andThen sayHi bar(123) // 依次输出 hello、hi
如果想调换执行顺序,用compose就行(g compose f等价于f andThen g):
val barReverse: Int => Unit = sayHi compose sayHello barReverse(123) // 同样输出 hello、hi,因为compose是先执行右边的函数
2. 使用下划线占位符简化匿名函数
如果你更习惯匿名函数的写法,可以用下划线_代替参数i,Scala会自动把它绑定到函数的参数上:
val bar: Int => Unit = { sayHello(_); sayHi(_) } bar(123) // 输出 hello、hi
这种写法虽然没有显式写i,本质还是匿名函数的简化语法,和你原来的写法逻辑一致,但更简洁。
3. 处理多个函数的场景:Function.chain
如果后续需要合并更多同类型的函数(比如再加一个sayHey: Int => Unit),用Function.chain会更方便,它可以接收一个函数列表,依次执行所有函数:
val sayHey: Int => Unit = { _ => println("hey") } val bar: Int => Unit = Function.chain(List(sayHello, sayHi, sayHey)) bar(123) // 输出 hello、hi、hey
这样不管有多少个函数,只要放进列表里就能自动按顺序执行,非常灵活。
内容的提问来源于stack exchange,提问作者Maths noob
相关产品推荐
相关产品推荐

