Scala中map后调用andThen无打印输出,如何实现?
问题原因分析
你的第一段代码未生效,核心是用错了andThen的适用场景:andThen是函数(Function1/PartialFunction)专属方法,作用是组合两个函数的执行逻辑,而非集合的链式操作方法。
你在map返回的List实例上调用andThen,实际是利用了List实现PartialFunction的特性——此时List被当成了“按索引取元素”的偏函数,你组合了print函数,但根本没调用这个组合后的函数,所以打印逻辑完全没执行。最终函数返回Unit,在REPL中就显示成了"()"。
基于
andThen的解决办法 要实现需求,你需要把“集合映射”和“遍历打印”分别包装成函数,再用andThen串联执行:
def multiPrint(list: List[Int], number: Int): Unit = { // 定义两个独立函数:一个负责映射处理,一个负责打印所有元素 val mapFunc: List[Int] => List[Int] = _.map(_ * number) val printFunc: List[Int] => Unit = _.foreach(print) // 组合函数:先执行映射处理,再把结果传给打印逻辑,最后传入目标列表执行 mapFunc.andThen(printFunc)(list) }
也可以写成更简洁的内联形式:
def multiPrint(list: List[Int], number: Int): Unit = { ((_: List[Int]).map(_ * number)).andThen(_.foreach(print))(list) }
这里andThen的作用是将两个函数串联:先通过第一个函数完成列表的映射转换,再将转换后的结果传入第二个函数执行遍历打印,完全符合你想要的链式调用逻辑。
内容的提问来源于stack exchange,提问作者LuizaBt
相关产品推荐
相关产品推荐

