gpt4 book ai didi

scala - 如何处理 Scala 中的列表选项?

转载 作者:行者123 更新时间:2023-12-04 18:08:20 27 4
gpt4 key购买 nike

假设我有一个函数 getCustomersgetOrdersByCustomer .

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

现在我可以轻松定义一个函数 getOrdersOfAllCustomers
def getOrdersOfAllCustomers(): List[Order] =
for(cust <- getCustomer(); order <- getOrderByCustomer(cust)) 产出订单

到目前为止,一切都很好,但如果 getCustomergetOrdersByCustomer返回列表的选项?

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

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

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

  • 您建议如何实现它?

    最佳答案

    我认为您应该考虑三种可能性——填充列表、空列表或错误——并避免进行大量不雅测试来确定发生了哪种情况。

    所以使用 TryList :

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

    如果一切顺利,你会得到一个 Success[List[Order]] ;如果没有, Failure[List[Order]] .

    这种方法的美妙之处在于无论发生哪种情况——填充列表、空列表或错误——您都可以用列表做所有想做的事情。这是因为 Try是一个 monad,就像 Option是。来吧 filter , forEach , map ,等等,让你心满意足,而不必关心这三个中的哪一个发生了。

    一件事是那个尴尬的时刻,你必须弄清楚是成功还是失败了。然后使用 match表达:
    getOrdersOfAllCustomers() match {
    case Success(orders) => println(s"Awww...yeah!")
    case Failure(ex) => println(s"Stupid Scala")
    }

    即使您不使用 Try ,我恳请您不要对待与填充列表不同的空列表。

    关于scala - 如何处理 Scala 中的列表选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21380057/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com