Scala 在列表迭代中使用Try[Boolean]

Scala 在列表迭代中使用Try[Boolean],scala,Scala,上面的方法有效,但当我将方法更改为下面的方法时 case class Employee(name :String, dept :String, empId:String, startDate:String) val emp1 = Employee("abc","accounts", "1234","2019-09-28") val emp2 = Employee("def","HR", "12345","2019-09-29") val emp3 = Employee("pp","HR", "1

上面的方法有效,但当我将方法更改为下面的方法时

case class Employee(name :String, dept :String, empId:String, startDate:String)
val emp1 = Employee("abc","accounts", "1234","2019-09-28")
val emp2 = Employee("def","HR", "12345","2019-09-29")
val emp3 = Employee("pp","HR", "12346", "2019-09-28")
val emp4 = Employee("xyz","accounts", "12347","2019-09-20")

val list = Seq(emp1, emp2, emp3, emp4)

def isValidDate(date: LocalDateTime, e: 
   Employee):Boolean={
     date.isAfter(e.startDate)
    }

private def test(name :String, date:String,list:Seq[Employee])={

  list.exists(e =>isValidDate(LocalDate.parse(date).atStartOfDay(), e))
}

test("abc",2019-09-28, list)
test("xyz",2019-09-28, list)
test("def",2019-09-28, list)
下一行给出编译错误,因为它需要一个布尔值

def isValidDate(date: LocalDateTime, e: 
   Employee):Try[Boolean]={
     date.isAfter(e.startDate)
    }

我希望成功和失败的处理在
isValidDate
方法之外

首先,您需要更改
isValidDate
的实现:

  list.exists(e =>isValidDate(date, e))
然后,高阶函数的实现需要处理
Try

def isValidDate(date: LocalDateTime, e: Employee): Try[Boolean]={
  Try { date.isAfter(e.startDate) }
}
或者正如臧在评论中所建议的那样:

private def test(name: String, date: LocalDateTime, list: Seq[Employee]) = {
  list.exists(isValidDate(date, _) match {
    case Failure(_) => false
    case Success(value: Boolean) => value
  })
}

我想说的是,我不确定所有这些都是必要的。
isAfter
是否引发异常?Try主要用于捕获异常代码,我认为这里没有这种情况。

如果您想在
isValidDate
之外处理异常,那么更改
isValidDate
没有任何意义,您只需在外部捕获异常即可。比如说

private def test(name: String, date: LocalDateTime, list: Seq[Employee]) = {
  list.exists(isValidDate(date, _).getOrElse(false))
}
如果出现异常,整个测试将失败。如果您想忽略异常并在以后继续测试员工,请执行此操作

private def test(name: String, date: LocalDateTime, list: Seq[Employee]) =
  Try {
    list.exists(e => isValidDate(date, e))
  }.getOrElse(false)
但是,在这种情况下,我认为最好将异常处理放在
isValidDate
中,即使这不是您想要的:

private def test(name: String, date: LocalDateTime, list: Seq[Employee]) =
  list.exists(e => Try(isValidDate(date, e)).getOrElse(false))

为什么不
isValidDate(日期,uu)。getOrElse(假)
采购订单明确表示,他希望管理it的成功和失败。在处理故障的特殊情况下,您的解决方案无疑更加优雅。我将把它添加到答案中。@hasumedic my bad我已经更新了可能引发异常的代码
def isValidDate(date: LocalDateTime, e: Employee): Boolean =
  Try(date.isAfter(e.startDate)).getOrElse(false)

private def test(name: String, date: LocalDateTime, list: Seq[Employee]) =
  list.exists(e => isValidDate(date, e))