2016-09-24 4 views
0

Я чувствую, что я неправильно использую параметры здесь, но не вижу, как правильно использовать getOrElse, чтобы мое состояние работало.У меня проблемы с настройками

Текущий плохой код:

if (car.getWheel.isDefined) { 
    car.getWheel.get.getHubCap.isShinierThan(hubcap2) 
} 
else { 
    // Do nothing 
} 

Я хотел бы использовать что-то простое, как getOrElse вместо этого уродливого сочетания, если заявление и с помощью «.get». Выражение соответствия будет делать то же самое, что и оператор if, но снова займет три строки и в основном будет изобретать вариант. Есть ли какой-то метод в опции, который позволяет мне ничего не делать для Nones?

Моя цель: Если опция содержит Нет, я хотел бы, чтобы строка кода выполняла ничего. Я не хочу вызывать getHubCap по некоторому параметру getOrElse.

+0

http://www.scala-lang.org/api/current/#scala.Option –

ответ

4

Вы можете использовать map:

val result: Option[Boolean] = car.getWheel.map(_.getHubCap.isShinierThan(hubcap2)) 

Код внутри map будет выполняться только тогда, когда Option является Some. Он рассматривает тип Option как список с одним или без элементов. Когда вы набираете пустой список, вы просто получаете пустой список; когда вы набираете список из одного элемента, вы получаете новый список из одного элемента, но с отображаемым значением

+0

getWheel возвращает одно колесо, к сожалению, но я не вижу, как картирование бы избавиться от потенциальных Nones? – sudom82

+0

Прохладный, не знал, что относительно карты. Спасибо, отмечен как ответ. – sudom82

0

Я стараюсь использовать карту, чтобы разделить мои случаи. case _ может быть важным, потому что это случай по умолчанию и будет соответствовать, если ни один из предыдущих случаев не будет соответствовать. Это позволяет запрограммировать код и обрабатывать все случаи краев.

Как вы можете видеть, также можно добавить условия, используя в заявлении дела if.

val opt: Option[String] = Some("foo") 

val printString: String = opt match { 
    case Some(string) if string == "bar" => string 
    case Some(string) => string 
    case _ => "none" 
} 

println(printString) 
+1

Это не работает - вы, скорее всего, подразумеваете 'match', а не' map', и в любом случае 'case _' обычно является antipattern на мой взгляд. Пусть компилятор скажет вам, не обработали ли вы все случаи. –

+0

К сожалению, вы абсолютно правы, изменили его соответствие. Что касается 'case_', я думаю, что для этого есть место. Он может представлять все случаи, которые не вызывают беспокойства. Например, если есть 10 случаев, но вы только заботитесь о первом. Простая обработка других 9 с помощью случая по умолчанию – toidiu

Смежные вопросы