Примеры использования некоторых методов Scala Option - PullRequest
7 голосов
/ 26 июля 2011

Я прочитал сообщение в блоге рекомендовал мне здесь .Теперь мне интересно, для чего эти методы полезны.Можете ли вы показать примеры использования forall (в отличие от foreach) и toList из Option?

Ответы [ 3 ]

24 голосов
/ 27 июля 2011
  • map: позволяет преобразовать значение «внутри» в Option, как вы, вероятно, уже знаете, для List с.Эта операция делает Option функтором (вы можете сказать «endofunctor», если хотите напугать своих коллег)
  • flatMap: Option на самом деле является монадой, а flatMap делает ее одной (вместес чем-то вроде конструктора для одного значения).Этот метод можно использовать, если у вас есть функция, которая превращает значение в Option, но у вас есть значение, которое уже «обернуто» в Option, поэтому flatMap сохраняет развертывание перед применением функции.Например, если у вас есть Option[Map[K,V]], вы можете написать mapOption.flatMap(_.get(key)).Если бы вы использовали простой map здесь, вы бы получили Option[Option[V]], но с flatMap вы получите Option[V].Этот метод круче, чем вы думаете, так как он позволяет очень гибко объединять функции воедино (это одна из причин, по которой Haskell любит монады).
  • flatten: если выимеют значение типа Option[Option[T]], flatten превращает его в Option[T].Это то же самое, что и flatMap(identity(_)).
  • orElse: если у вас есть несколько альтернатив, заключенных в Option с, и вы хотите первую, которая фактически содержит значение, вы можете связать эти альтернативы с помощью orElse: steakOption.orElse(hamburgerOption).orElse(saladOption)
  • getOrElse: получить значение из Option, но указать значение по умолчанию, если оно пустое, например, nameOption.getOrElse("unknown").
  • foreach: сделать что-то со значением внутри, если оно существует.
  • isDefined, isEmpty: определить, содержит ли это Option значение.
  • forall, exists: проверяет, имеет ли значение данный предикат.forall - это то же самое, что option.map(test(_)).getOrElse(true), exists - то же самое, только с false по умолчанию.
  • toList: Сюрприз, он преобразует Option в List.
10 голосов
/ 26 июля 2011

Многие из методов в Option могут присутствовать не только для единообразия (с коллекциями), а не для их полезности, поскольку все они очень маленькие функции и поэтому не требуют больших усилий, но служат определенной цели, иих значение становится понятным, как только вы знакомы со структурой сбора (как часто говорят, Option подобен списку, который не может иметь более одного элемента).

forall проверяет свойство значения внутри опции.Если значения нет, проверка пройдена.Например, если при аренде автомобиля вам предоставляется один additionalDriver: Option[Person], вы можете сделать

additionalDriver.forall(_.hasDrivingLicense)

точно так же, как если бы было разрешено несколько дополнительных водителей и у вас был список.

toList может быть полезным преобразованием.Предположим, у вас есть опции: List [Option [T]], и вы хотите получить List [T] со значениями всех опций Some.Вы можете сделать

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

(или лучше options.flatMap(_.toList))

6 голосов
/ 26 июля 2011

У меня есть один практический пример метода toList. Вы можете найти его в scaldi (моя структура внедрения зависимостей Scala) в Module.scala в строке 72:

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

В этом контексте getBindings метод может вернуть либо Nil, либо List только с одним элементом. Я могу получить его как Option с discoverBinding. Я считаю удобным иметь возможность конвертировать Option в List (который либо пустой, либо имеет один элемент) с помощью метода toList.

...