2017-07-24 94 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]为空。