Почему Foreach лучше, чем получить для параметров Scala?

StackOverflow https://stackoverflow.com/questions/6819373

  •  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 это более функциональный способ делать вещи, где мы говорим Что делать, но не как делать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top