编写功能代码,查找功能的例子

时间:2016-10-26 11:20:31

标签: scala functional-programming

我正在尝试根据FP范例转换以下函数:

def findByEmail(email: String): User = {
   val result = jdbc.find("select * from user where email..")
   return result;
}

我的第一次尝试是以下一次:

def findByEmail(email: String): Either[String, Option[User]] = {
   try {
      val result = jdbc.find("select * from user where email..")
   } catch (Exception e) {
      return Left(e.getMessage())
   }

   if (result == null) return Right(None)

   Right(result)
}

我不喜欢的是捕获所有异常的尝试。这样的事情有什么好的做法吗?左侧是否有更好的数据类型而不是String?可以在那里使用Exception类吗?

1 个答案:

答案 0 :(得分:5)

一种方法是改为Try[User]。然后,来电者可以在Success[A]Failure[Throwable]上匹配:

def findByEmail(email: String): Try[User] = Try { jdbc.find("select * from user where email..") }

然后强制调用者从Try中提取数据或在其上撰写方法:

findByEmail("my@mail.com") match {
  case Success(user) => // do stuff
  case Failure(exception) => // handle exception
}

或者如果你想撰写方法:

// If the Try[User] is a Failure it will return it, otherwise executes the function.
findByEmail("my@mail.com").map { case user => // do stuff } 

@Reactormonk在评论中写的另一个选项是使用doobie,它是针对Scala的JDBC的功能抽象层。