Обычно не рекомендуется возвращать Option
, а затем использовать getOrElse
для получения некоторого значения часового, что означает "не найден". Вот для чего предназначен Option
: чтобы показать, что значение не найдено!
Option
действительно показывает свою мощь, когда используется в сочетании с конструкциями функционального программирования, такими как map
и foreach
. Это наиболее эффективно при работе с несколькими вариантами. Например, предположим, что я пишу метод, который принимает строку и возвращает мне файл, но только если файл существует и является файлом, а не каталогом:
import java.io._;
def niceFile1(s: String): File = {
val f = new File(s);
if (f.exists && !f.isDirectory) f else null
}
def niceFile2(s: String): Option[File] = {
val f = new File(s);
if (f.exists && !f.isDirectory) Some(f) else None
}
Пока что использовать null
проще - по крайней мере, пока вы не забудете, что это может дать вам null
, и вы получите NPE. В любом случае, давайте теперь попробуем его использовать.
def niceFopen1(s: String) = {
val f = niceFile1(s);
if (f!=null) new FileInputStream(f) else null;
}
def niceFopen2(s: String) = niceFile2(s).map(f => new FileInputStream(f))
Смотри, что случилось! В первом случае нам приходилось выполнять логические тесты вручную и создавать временные переменные. Тьфу! Во втором случае map
сделал всю грязную работу за нас: None был сопоставлен с None, а Some(file)
был сопоставлен с Some(fileinputstream)
. Легко!
Но это еще лучше. Может быть, мы хотим найти размер целой пачки файлов:
def totalSize2(ss: Seq[String]) = {
(0L /: ss.flatMap(niceFile2)){(sum,f) => sum+f.length}
}
Подождите, что здесь происходит - как насчет всех None
? Разве мы не должны обращать внимание и как-то с ними обращаться? Ну, вот и приходит flatMap
: он объединяет все ответы в один список. None
- это ответ нулевой длины, поэтому он игнорирует его. Some(f)
имеет один ответ - f
- поэтому он помещает его в список. Затем мы используем сгиб, чтобы сложить все длины - теперь, когда все элементы в списке допустимы. Довольно мило!