如何在Scala中处理列表选项?

Mic*_*ael 5 monads functional-programming scala

假设我有一个函数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返回None。

您如何建议实施?

tir*_*ran 2

尝试这个,

def getOrdersOfAllCustomers(): Option[List[Order]] =
  for{
    cust <- getCustomer().toList.flatten; 
    order <- getOrderByCustomer(cust).toList.flatten
  } yield order
Run Code Online (Sandbox Code Playgroud)