Scala:如何创建多个方法并依次应用?函数式实现求解
这问题刚好能用上Scala的偏应用函数和集合高阶操作来解决,我给你拆解一下思路和实现方式:
首先先把基础的定义写出来:
val suffixes = List("1", "2", "3") def concat(str: String)(tail: String): String = str + tail
第一步:生成你需要的偏应用函数
你的需求是针对列表里的每个元素,生成固定第二个参数的偏应用函数——也就是每个函数都接受一个字符串,返回它加上对应后缀的结果。用map就能轻松实现:
// 对每个suffix,生成偏应用函数:String => String val concatFuncs = suffixes.map(suffix => concat(_: String)(suffix))
这里的concat(_: String)(suffix)就是偏应用的写法:我们固定了第二个参数suffix,第一个参数用占位符_表示,这样就得到了一个只需要传入初始字符串就能执行的函数。
第二步:依次应用这些函数到测试字符串
接下来要把这些函数按顺序作用在"abc"上,这时候foldLeft是最适合的工具——它会从左到右遍历函数列表,把上一次的结果作为下一次的输入,完美匹配"依次作用"的需求:
val result = concatFuncs.foldLeft("abc")((currentStr, func) => func(currentStr)) println(result) // 输出: abc123
简化写法(可选)
如果你不需要显式保留那些偏应用函数,只是想得到最终结果,还可以把两步合并成一行,直接在foldLeft里调用柯里化的concat,代码更简洁:
val result = suffixes.foldLeft("abc")((current, suffix) => concat(current)(suffix))
这种方式本质上和前面的思路一致,只是把生成偏应用函数的步骤内联到了折叠操作里,同样是纯函数式的实现。
内容的提问来源于stack exchange,提问作者CodingNow
相关产品推荐
相关产品推荐

