2017-07-24 139 views
0

我試圖檢查方法返回空利用地圖功能,以檢測爲空序列無法在斯卡拉

val test: Option[Seq[Employee]] = repo.findByName(name); 
print(test) 
test.map(r => print(r.seq)).getOrElse(print("not found")) 

我的功能repo.findByName的返回類型(調用數據庫,以檢查是否存在名稱)是Option[Seq[Employee]]

輸出

Some(Buffer()) 
Some(Buffer()) 

我期望的輸出 - 沒有找到

+0

好像'findByName'返回一個空序列,如果它沒有找到用戶? –

回答

1

如果您要檢查,以防Option[T]的空虛返回類型是空序列(因爲它好像這就是該API返回的),你可以這樣做:

val result: String = repo 
       .findByName(name) 
       .filter(_.nonEmpty) 
       .fold("no employees")(_ => "found employees") 
println(result) 

如果要打印出來的員工,你可以這樣做:

val result: Seq[Employee] = repo 
          .findByName(name) 
          .getOrElse(Seq.empty[Employee]) 

result.foreach(println) 

會打印出每個員工,假設這是一個案例類,並具有適當的toString

+0

我需要打印對象Employee的值而不是文本 – coder25

+0

您可以使用'fold'打印任何你想要的東西。 –

0

試試這個:

test.map(r=>if(r.isEmpty) "it's empty" else "not empty").getOrElse("something else")

在這種情況下,很可能沒有發現它並不意味着它沒有被發現,而是例如發生了一些錯誤。

0

嘗試

print(test.map(r => r.seq).getOrElse(Seq("not found"))) 
0

如果你必須使用一個Option,確保它會返回一個SomeNone

從你的例子看來,findByName將永遠返回一個。

無論如何,如果你必須使用工作,那麼這應該返回一些有用的東西:

test.getOrElse(Nil) match { 
     case Nil  => println("Not Found") 
     case x :: xs => println(x :: xs) 
} 
0
val result = repo.findByName(name) 
       .filter(_.nonEmpty) 
       .map(_.toString) 
       .getOrElse("not found") 

print(result) 

resultString,並賦值爲"not found"如果repo回報NoneSome[Seq[Employee]]其中Seq[Employee]爲空。