这是我想要实现的简化示例。我基本上有一个字符串,我需要根据Future字符串列表中的元素进行修改。以下是我想要实现的一个简短示例。
import scala.concurrent.Future
import scala.util.matching.Regex
object FutureEx01 extends App
{
var myString = "what the fcuk is happening here"
val myList: Future[List[String]] = Future { List("fcuk", "shit", "motherfcuker", "ahole") }
// TODO: iterate over myList, look at the elements and if there is a match with any word in myString, replace it.
/**
//this is what I could think of!
myList.map({
listEle: String =>
val listEleRegex: Regex = listEle.r
myString = listEleRegex.replaceAllIn(myString,"CENSORED")
})
*/
}
所以我想替换我的字符串中的所有不良单词。你能帮我解决一下这个问题吗?
谢谢
答案 0 :(得分:2)
我认为这就是你所需要的。
DataFrame
结果是val goodString = myList.map{ bads =>
myString.replaceAll(bads.mkString("|"), "CENSORED")
}
类型,将在Future[String]
完成时完成。
答案 1 :(得分:1)
foldLeft
就是你想要的)。我不确定为什么myList
这个东西是Future
,但假设这就是你真正想要的东西,你需要在foldLeft
内map
:
val futureResult: Future[String] = myList.map { exclude =>
exclude
.foldLeft(myString) { case(str, ex) => ex.r.replaceAllIn(str, "CENSORED") }
}
现在你可以做val result = Await.result(futureResult)
或。{
futureResult.onComplete(println)
等。
答案 2 :(得分:0)
首先,您必须将字符串拆分为数组:
val splitted = myString.split(" ")
然后你可以映射未来:
val future = myList.map(splitted.diff(_))
这将带来结果的未来。要提取最终结果,您需要等待值:
import scala.concurrent.duration._
Await.result(future, 1 second) //blocking
或使用回调:
import scala.util.{Failure, Success}
future.onComplete { //not blocking
case Success(value) => println(value)
case Failure(e) => e.printStackTrace
}