2016-01-03 16 views
5

Ben scala güvenli yazın nasıl sevmez, ama içine yayınlanmaya devam bir çalışma zamanı hatasıdırmemnun tip hatalar

Future.filter predicate is not satisfied 
bu hatayı alıyorum neden görebilirsiniz

, Sadece bu hatanın en iyi nasıl işleneceği konusunda tavsiyede bulunup, incelikle ilgilenebilirim ya da belki bu yanlışı yapıyorum?

val r: Future[play.api.mvc.Result] = for { 
    account <- accountServer.get(...) 
    if account.isConfirmed 
    orders <- orderService.get(account, ...) 
} yield { 
    ... 
} 

Hesap onaylanmadıysa, yukarıdaki hatayı alacağım.

Filtrenin başarısızlığa uğraması ihtimali bulunduğundan, bu skalanın getiri dönüş değeri bir Opsiyonu oluşturacağını düşünürdüm. Yok hayır?

val orders = accountServer.get(...) 
          .flatMap { account => 
          if(account.isConfirmed) orderService.get(account, ...) 
          else Future.successful(Seq.empty) 
          } 
+0

Nasıl, Birini dönebilirsiniz (Jean Logeart cevabı olarak, ama içinde-anlama için) sonuç türü 'Sonuç' olur mu? – Dima

+1

'' Gelecek '' anlamlı bir hata üretmek için. Gelecek [Sonuç] 'olmalıdır? –

+0

@ m-z evet bunu bir gelecek için değiştirdim. – Blankman

cevap

4

Muhtemelen hangi bir else durumda belirtebilirsiniz basit flatMap kullanmak istiyorum durumda, güvenmek güvensiz (bir if-guard kullanarak). Ama aynı şeyi başarmak için için-kavrama içinde yapabilirsiniz:

val r: Future[play.api.mvc.Result] = for { 
    account <- accountServer.get(...) 
    orders <- if (account.isConfirmed) orderService.get(account, ...) 
      else Future.successful(Seq.empty) 
} yield { 
    ... 
} 

sen beyan eğer

+0

Ama bunun için bir for-comp işlemek istiyorum çünkü şu anda bunları kullanıyorum. Yoksa bu mümkün değil mi? – Blankman

7

filter tür sistemi else için geri ne bilemeyiz çünkü Future için mantıklı değil: