2012-05-02 6 views
14

Given snippet komponuje wywołań metod, które zwracają typ opcji. Chciałbym zadzwonić do następnej metody, jeśli poprzednie połączenie zwróciło Brak. Mogę to zrobić z tym fragmentem, ale wygląda to dość niechlujnie. Mam więc nadzieję, że istnieje lepszy sposób na zrobienie tego.Czy istnieje sposób łańcuch metod, które zwracają Option-Type w sposób taki jak getOrElse, ale zachowuje typ opcji

+2

Nie to, czego szukasz, ale jeśli chcesz osiągnąć sukces łańcuchowy (użyj 'Some x' jako danych wejściowych do następnej funkcji) możesz użyć' for': 'for (myWife <- getSpouse (me); mySIL <- getSister (myWife); myBIL <- getSpouse (mySIL); myBro <- getBrother (mnie); if (myBro == myBIL)) dają myBro' – rampion

Odpowiedz

24

Tak, orElse jest trochę czystsze:

def amountToPay : Option[TextBoxExtraction] = 
    getMaxByFontsize(keywordAmountsWithCurrency) 
    .orElse(getMaxByFontsize(keywordAmounts)) 
    .orElse(highestKeywordAmount) 
    .orElse(getMaxByFontsize(amountsWithCurrency)) 
    .orElse(highestAmount) 

Można też po prostu umieścić elementy w Seq a następnie użyć czegoś podobnego xs.reduceLeft(_ orElse _) lub xs.flatten.headOption.getOrElse(highestAmount).

+0

@Nicolas, Zgadzam się, że twoja wersja jest trochę czystsza, ale średnik wnioskowanie ugryzie cię w REPL. –

+2

': paste' zrobi lewę w REPL (chciałbym, abyśmy mogli zaproponować edycję w stackoverflow zamiast bezpośredniego zgłaszania zmian) – Nicolas

+0

Och, jest też problem, że parentetyzacja w mojej wersji była _wrong_. Więc twoje jest o wiele lepsze. –

Powiązane problemy