加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在Scala中处理List的选项?

发布时间:2020-12-16 18:04:40 所属栏目:安全 来源:网络整理
导读:假设我有一个函数getCustomers和getOrdersByCustomer. def getCustomer():List[Customer] = ...def getOrdersByCustomer(cust: Customer): List[Order] = ... 现在我可以轻松定义一个函数getOrdersOfAllCustomers def getOrdersOfAllCustomers(): List[Order
假设我有一个函数getCustomers和getOrdersByCustomer.

def getCustomer():List[Customer] = ...
def getOrdersByCustomer(cust: Customer): List[Order] = ...

现在我可以轻松定义一个函数getOrdersOfAllCustomers

def getOrdersOfAllCustomers(): List[Order] =
  for(cust <- getCustomer(); order <- getOrderByCustomer(cust)) yield order

到目前为止,这么好但是如果getCustomer和getOrdersByCustomer返回列表的选项呢?

def getCustomer():Option[List[Customer]] = ...
def getOrdersByCustomer(cust: Customer): Option[List[Order]] = ...

现在我想实现两种不同的getOrdersOfAllCustomers():

>如果其中一个函数返回None,则返回None;
>如果getCustomer返回None,则返回None,并且不关心getOrdersByCustomer是否返回None.

你会如何建议实施它?

解决方法

我认为你应该考虑三种可能性 – 一个填充列表,一个空列表或一个错误 – 并避免许多不优雅的测试,以找出发生了哪一个.

所以使用Try with List:

def getOrdersOfAllCustomers(): Try[List[Order]] = {
  Try(funtionReturningListOfOrders())
}

如果一切顺利,您将获得成功[List [Order]];如果没有,失败[列表[订单]].

这种方法的优点在于无论发生了什么 – 填充列表,空列表或错误 – 您可以使用列表完成所需的所有操作.这是因为Try就像Option一样是monad.继续过滤,将每个,地图等过滤到心脏的内容,而不关心这三者中的哪一个发生.

一件事是,当你必须弄清楚成功或失败是否发生时,这个尴尬的时刻.然后使用匹配表达式:

getOrdersOfAllCustomers() match {
  case Success(orders) => println(s"Awww...yeah!")
  case Failure(ex) => println(s"Stupid Scala")
}

即使您不使用Try,我也恳请您不要处理与填充列表不同的空列表.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读