我正在尝试创建一个函数,它将返回另一个将执行多个字符串操作的函数(由给定的选项决定):
选项为U
(大写),l
(小写)T
(标题大小写)s
(已排序)r
(反向)和{{1} }(删除所有空格)。
现在,我的代码将采用上面的一个选项(因此,*
或U
等)并返回正确的结果。我想要的是s
应该返回一个函数,它将字符串转换为大写,排序并删除所有空格。
我无法弄清楚如何修改我的功能以适应多种选择。
stringPipeline("Us*")
我尝试使用def stringPipeline(Option:String) = (str:String) => {
val UpperCase = () => str.toUpperCase
val LowerCase = () => str.toLowerCase
val titleCase = () => str.split(' ').map(_.capitalize).mkString(" ")
val reverse = () => str.reverse
val sortChars = () => str.sorted
val replaceChar = () => str.replaceAll("\\s","")
Option match {
case "U" => UpperCase()
case "l" => LowerCase()
case "T" => titleCase()
case "r" => reverse()
case "s" => sortChars()
case "*" => replaceChar()
}
}
运算符(没有工作),&&
运算符(称为两个函数)并执行类似+
的操作,这会产生编译器错误
答案 0 :(得分:3)
您可以使用foldLeft
使用一个单独的函数递归应用字符串上的所有运算符,该函数当时只有一个选项。
def stringPipeline(ops: String) = (str: String) => {
def applyOp(str: String, op: String) = op match {
case "U" => str.toUpperCase
case "l" => str.toLowerCase
case "T" => str.split(' ').map(_.capitalize).mkString(" ")
case "r" => str.reverse
case "s" => str.sorted
case "*" => str.replaceAll("\\s","")
}
ops.split("").foldLeft(str)(applyOp)
}
使用字符串进行测试:
val str = stringPipeline("Us*")("age bfh dc")
println(str)
将给出预期的结果
ABCDEFGH
答案 1 :(得分:0)
另一种方法是生成复合函数。您可以尝试然后编写功能。例如:
scala> def inputStringPipeline(inputStr: String): String => String = {
| val upperCase = (input: String) => input.toUpperCase
| val lowerCase = (input: String) => input.toLowerCase
| val titleCase = (input: String) => input.split(' ').map(_.capitalize).mkString(" ")
| val reverse = (input: String) => input.reverse
| val sortChars = (input: String) => input.sorted
| val replaceChar = (input: String) => input.replaceAll("\\s", "")
|
| val emptyFunc: String => String = (input: String) => input
| inputStr.foldLeft(emptyFunc) {
| case (funcAcc, present) =>
| val newFunc = present.toString match {
| case "U" => upperCase
| case "l" => lowerCase
| case "T" => titleCase
| case "r" => reverse
| case "s" => sortChars
| case "*" => replaceChar
| }
|
| funcAcc andThen newFunc
| }
|
| }
inputStringPipeline: (inputStr: String)String => String
scala> val input = "Us*"
input: String = Us*
scala> val func = inputStringPipeline(input)
func: String => String = scala.Function1$$Lambda$1061/1593722877@5ef7ae2f
scala> val str = func("age bfh dc")
str: String = ABCDEFGH
scala> println(str)
ABCDEFGH
这样就可以为给定的输入字符串操作生成一个新函数,并且可以与任意数量的字符串一起使用。这可以通过创建一次复合函数并再次使用它来节省时间。