如何迭代scala中的集合Future并修改现有的记录/变量?

时间:2018-02-07 19:11:09

标签: scala future

这是我想要实现的简化示例。我基本上有一个字符串,我需要根据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")
  })
*/
}

所以我想替换我的字符串中的所有不良单词。你能帮我解决一下这个问题吗?

谢谢

3 个答案:

答案 0 :(得分:2)

我认为这就是你所需要的。

DataFrame

结果是val goodString = myList.map{ bads => myString.replaceAll(bads.mkString("|"), "CENSORED") } 类型,将在Future[String]完成时完成。

答案 1 :(得分:1)

  1. 不要使用可变状态(foldLeft就是你想要的)。
  2. 我不确定为什么myList这个东西是Future,但假设这就是你真正想要的东西,你需要在foldLeftmap

    val futureResult: Future[String] = myList.map { exclude => 
      exclude
        .foldLeft(myString) { case(str, ex) => ex.r.replaceAllIn(str, "CENSORED") }
    } 
    
  3. 现在你可以做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
}