Почему Foreach лучше, чем получить для параметров Scala?
-
26-10-2019 - |
Вопрос
Почему использование foreach
, map
, flatMap
и т. д. считаются лучше, чем использование get
Для параметров Scala? Если я используюisEmpty
я могу позвонить get
безопасно.
Решение
Ну, это как -то возвращается к «Скажи, не спрашивай». Рассмотрим эти две строки:
if (opt.isDefined) println(opt.get)
// versus
opt foreach println
В первом случае вы смотрите внутрь opt
а затем реагируя в зависимости от того, что вы видите. Во втором случае вы просто говорите opt
Что вы хотите сделать, и позвольте этому справиться с этим.
Первый случай слишком много знает о Option
, повторяет логику внутренней по отношению к нему, хрупкая и подвержена ошибкам (это может привести к ошибкам времени выполнения, а не к ошибкам времени компиляции, если написано неправильно).
Добавьте к этому, это не композитно. Если у вас есть три варианта, о них позаботится один для понимания:
for {
op1 <- opt1
op2 <- opt2
op3 <- opt3
} println(op1+op2+op3)
С if
, все начинает быстро становиться грязными.
Другие советы
Одна хорошая причина для использования foreach
Растанавливает что -то с вложенными вариантами. Если у вас есть что -то вроде
val nestedOption = Some(Some(Some(1)))
for {
opt1 <- nestedOption
opt2 <- opt1
opt3 <- opt2
} println(opt3)
Консоль печатает 1
. Анкет Если вы распространяете это на случай, когда у вас есть класс, который при желании хранит ссылку на что -то, что, в свою очередь, хранит еще одну ссылку, для понимания позволяет избежать гигантской «пирамиды» ни одной/некоторой проверки.
Уже есть отличные ответы на фактический вопрос, но для получения дополнительной информации Option
-Во, ты обязательно должен проверить Шпаргалка для опционной версии Тони Морриса.
Причина, по которой более полезно применять такие вещи, как map
, foreach
, а также flatMap
непосредственно к Option
вместо использования get
а затем выполнять функцию, заключается в том, что она работает на любом Some
или же None
И вам не нужно делать специальные чеки, чтобы убедиться, что значение есть.
val x: Option[Int] = foo()
val y = x.map(_+1) // works fine for None
val z = x.get + 1 // doesn't work if x is None
Результат для y
Вот Option[Int]
, что желательно, поскольку если если x
Необязательно, тогда y
может быть не определен. С get
не работает None
, Вам нужно было бы сделать кучу дополнительной работы, чтобы убедиться, что вы не получили никаких ошибок; дополнительная работа, которая сделана для вас map
.
Проще говоря:
Если вам нужно что -то сделать (процедура, когда вам не нужно захватывать возвращаемое значение каждого вызова), только если опция определена (т.е.
Some
): использоватьforeach
(Если вы заботитесь о результатах каждого вызова, используйтеmap
)Если вам нужно что -то сделать, если опция определена, и что -то еще, если это не так: используйте
isDefined
В операторе IFЕсли вам нужно значение, если вариант
Some
, или значение по умолчанию, если этоNone
: использоватьgetOrElse
Пытаясь выполнить наши операции с get
это более обязательный стиль, где вам нужно тел Что делать и как делать Анкет Другими словами, мы диктуем вещи и больше копаем в Options
внутренние. Тогда как map,flatmap
это более функциональный способ делать вещи, где мы говорим Что делать, но не как делать.