在平面地图内组合条件并返回结果

时间:2017-10-26 13:20:38

标签: scala

val date2 = Option(LocalDate.parse("2017-02-01"))
//date1.compareTo(date2)>=0

case class dummy(val prop:Seq[Test])
case class Test(val s :String)
case class Result(val s :String)

  val s = "11,22,33"
  val t = Test(s)
  val dt =Test("2017-02-06")
  val list = dummy(Seq(t))
  val list2 = dummy(Seq(dt))
  val code = Option("22")


      val f = date2.flatMap(c => list2
                                  .prop
                                  .find(d=>LocalDate.parse(d.s)
                                  .compareTo(c)>=0))
                           .map(_ => Result("Found"))
                           .getOrElse(Result("Not Found"))

      code.flatMap(c => list
                         .prop
                         .find(_.s.split(",").contains(c)))
                  .map(_ => Result("Found"))
                  .getOrElse(Result("Not Found"))

我想&&以下条件并返回Result("Found")/Result("Not Found")

  1. d=>LocalDate.parse(d.s).compareTo(c)>=0)
  2. _.s.split(",").contains(c)
  3. 有没有办法实现上述目标。实际的场景列表和列表2是Future

2 个答案:

答案 0 :(得分:0)

在Option上使用模式匹配而不是使用flatMap

e.g。

val x = Some("20")
x match {
  case Some(i) => println(i) //do whatever you want to do with the value. And then return result
  case None => Result("Not Found")
}

看看你想要做什么,你必须使用模式匹配两次,这也是嵌套模式匹配。

答案 1 :(得分:0)

我试图根据期货制作一个更现实的例子。我将如何做到这一点:

val date2 = Option(LocalDate.parse("2017-02-01"))

case class Test(s: String)
case class Result(s: String)

val t = Test("11,22,33")
val dt = Test("2017-02-06")
val code = Option("22")

val f1 = Future(Seq(t))
val f2 = Future(Seq(dt))

// Wait for both futures to finish
val futureResult = Future.sequence(Seq(f1, f2)).map {
  case Seq(s1, s2) =>

    // Check the first part, this will be a Boolean
    val firstPart = code.nonEmpty && s1.exists(_.s.split(",").contains(code.get))

    // Check the second part, also a boolean
    val secondPart = date2.nonEmpty && s2.exists(d => LocalDate.parse(d.s).compareTo(date2.get) >= 0)

    // Do the AND logic you wanted
    if (firstPart && secondPart) {
      Result("Found")
    } else {
      Result("Not Found")
    }
}

// This is just for testing to see we got the correct result
val result = Await.result(futureResult, Duration.Inf)
println(result)

另外,您的示例中的codedate2值是选项...如果您的生产代码中出现这种情况,那么我们应首先检查它们是否都是定义。如果它们不存在那么就没有必要继续使用剩下的代码了:

val futureResult = if (date2.isEmpty || code.isEmpty) {
  Future.successful(Result("Not Found"))
} else {
  Future.sequence(Seq(f1, f2)).map {
    case Seq(s1, s2) =>

      val firstPart = s1.exists(_.s.split(",").contains(code.get))
      val secondPart = s2.exists(d => LocalDate.parse(d.s).compareTo(date2.get) >= 0)

      if (firstPart && secondPart) {
        Result("Found")
      } else {
        Result("Not Found")
      }
  }
}