2011-07-26 22 views

Odpowiedz

6

Mam jeden praktyczny przykład metody toList. Można go znaleźć w scaldi (moja ramowej wtrysk zależność Scala) w Module.scala w wierszu 72:

https://github.com/OlegIlyenko/scaldi/blob/f3697ecaa5d6e96c5486db024efca2d3cdb04a65/src/main/scala/scaldi/Module.scala#L72

W tej metodzie kontekst getBindings może wrócić albo Nil lub List tylko jednego elementu. Mogę go odzyskać jako Option z discoverBinding. Uważam, że wygodnie jest skonwertować Option na List (która jest pusta lub ma jeden element) za pomocą metody toList.

+0

Twój link jest martwy (teraz) –

+0

@AdamFraser: Przepraszam za to. Zaktualizowałem link, a także użyłem konkretnego drzewa zatwierdzeń zamiast wzorca. – tenshi

10

Wiele metod dostępnych w Opcjach może być bardziej dostępnych dla zachowania jednolitości (z kolekcjami), niż dla ich przydatności, ponieważ wszystkie one są bardzo małymi funkcjami i dlatego nie szczędzą wiele wysiłku, ale służą celowi, a ich znaczenie jest jasne, gdy zapoznasz się ze strukturą kolekcji (jak często się mówi, opcja jest jak lista, która nie może mieć więcej niż jeden element).

forall sprawdza właściwość wartości wewnątrz opcji. Jeśli nie ma żadnej wartości, przepustka kontrolna. Na przykład, jeśli w wynajęciu samochodu, masz prawo jeden additionalDriver: Option[Person] można zrobić

additionalDriver.forall(_.hasDrivingLicense) 

dokładnie to samo, co byś zrobił, gdyby kilka dodatkowych sterowników wolno i trzeba było ich listę.

toList może być użytecznym przekształceniem. Załóżmy, że masz opcje: List [Opcja [T]], i chcesz uzyskać listę [T], z wartościami wszystkich opcji, które są Niektóre. można zrobić

for(option <- options; value in option.toList) yield value 

(lub lepiej options.flatMap(_.toList))

24
  • map: Pozwala przekształcić wartość "wewnątrz" an Option, jak pewnie już wiesz na List s. Ta operacja sprawia Option funktorem (można powiedzieć „endofunctor” jeśli chcesz przestraszyć swoich kolegów)
  • flatMap: Option jest rzeczywiście monada, a flatMap czyni go jednym (razem z czymś w rodzaju constuctor dla pojedynczej wartości). Tej metody można użyć, jeśli masz funkcję, która zmienia wartość w Option, ale wartość, którą masz, jest już "opakowana" w Option, więc zapisuje rozpakowanie przed zastosowaniem funkcji. Na przykład. jeśli masz numer Option[Map[K,V]], możesz napisać mapOption.flatMap(_.get(key)). Jeśli użyjesz tutaj prostego map, uzyskasz Option[Option[V]], ale z flatMap otrzymasz Option[V]. Ta metoda jest chłodniejsza niż myślisz, ponieważ pozwala łączyć funkcje w bardzo elastyczny sposób (co jest jedną z przyczyn, dla których monitory Haskell kochają).
  • flatten: Jeśli masz wartość typu Option[Option[T]], flatten zmienia ją w Option[T].Jest to to samo, co flatMap(identity(_)).
  • orElse: Jeśli masz kilka alternatyw zawinięte w Option s, a chcesz pierwszy z nich, który posiada faktycznie wartość można łańcucha tych alternatyw ze orElse: steakOption.orElse(hamburgerOption).orElse(saladOption)
  • getOrElse: Get wartość wyjścia z Option, ale podaj domyślną wartość, jeśli jest pusta, np nameOption.getOrElse("unknown").
  • foreach: Zrób coś z wartością wewnątrz, jeśli istnieje.
  • isDefined, isEmpty: Określ, czy ta Option ma wartość.
  • forall, exists: Sprawdza, czy dany predykat zawiera wartość. forall jest taki sam jak option.map(test(_)).getOrElse(true), exists jest taki sam, tylko z domyślną wartością false.
  • toList: Niespodzianka, konwertuje Option na List.
Powiązane problemy