2017-10-26 8 views
0
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)

上記達成するための任意の可能な方法があります実際のシーンリストとリスト2には、Future

答えて

0

flatMapを使用する代わりにOptionでパターンマッチングを使用します。

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") 
} 

あなたがしようとしていることを見ると、パターンネストを2回使用する必要があります。

0

私はFuturesに基づいてより現実的な例を作ろうとしました。ここで私はそれを行うだろうかです:

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") 
     } 
    } 
} 
関連する問題