2015-12-29 2 views
1

Я являюсь подписчиком в фиде сообщения для нескольких полей, мне нужно установить значения из фида для объекта домена и иметь код, как показано ниже:Как уменьшить избыточность обработки полей обработчиком фида

if (map.contains(quoteBidPriceAcronym)) { 
    quote.bid.price = Some(map.get(quoteBidPriceAcronym).get.asInstanceOf[Number].doubleValue()); 
    quote.changed = true; 
} 
if (map.contains(quoteBidSizeAcronym)) { 
    quote.bid.size = Some(sizeMultipler() * map.get(quoteBidSizeAcronym).get.asInstanceOf[Number].intValue()); 
    quote.changed = true; 
} 
if (map.contains(quoteBidNumAcronym)) { 
    quote.bid.num = Some(map.get(quoteBidNumAcronym).get.asInstanceOf[Number].shortValue()); 
    quote.changed = true; 
} 
if (map.contains(quoteAskPriceAcronym)) { 
    quote.ask.price = Some(map.get(quoteAskPriceAcronym).get.asInstanceOf[Number].doubleValue()); 
    quote.changed = true; 
} 
if (map.contains(quoteAskSizeAcronym)) { 
    quote.ask.size = Some(sizeMultipler() * map.get(quoteAskSizeAcronym).get.asInstanceOf[Number].intValue()); 
    quote.changed = true; 
} 
if (map.contains(quoteAskNumAcronym)) { 
    quote.ask.num = Some(map.get(quoteAskNumAcronym).get.asInstanceOf[Number].shortValue()); 
    quote.changed = true; 
} 
if (map.contains(quoteExchTimeAcronym)) { 
    quote.exchtime = getExchTime(String.valueOf(map.get(quoteExchTimeAcronym).get)); 
} 

Это выглядит довольно излишним, любые предложения по его улучшению?

ответ

1

Вы можете сделать что-то вроде:

map.get(quoteBidPriceAcronym).map { item => 
    quote.bid.price = item.map(_.asInstanceOf[Number].doubleValue()) 
    quote.changed = true 
} 

Другие вопросы могут быть лучше зафиксировать снаружи. Например. почему map [quoteBidPriceAcronym] хранит параметр, если ваш код предполагает, что он не будет None?

+0

Это может быть Ни один, не так ли? если quoteBidPriceAcronym не существует на карте – carfield

+0

Да, но сама запись карты необязательна, не так ли? – Ashalynd

1

Лично мне не нравится код, изменяющий состояние объекта (quote), но это вопрос о Scala, а не о функциональном программировании.

Это сказало, что я бы изменил способ использования вами карты map ключей. Вместо того, чтобы проверять, существует ли какое-либо значение для выполнения какого-либо действия, у меня будет карта от ваших ключей к действиям, и я буду перебирать элементы map.

например (при условии, map имеет тип Map[String, Any]):.

val actions: Map[String, PartialFunction[Any, Unit]] = Map(
    (quoteBidPriceAcronym, {case n: Number => quote.bid.price = Some(n.doubleValue())}), 
    (quoteBidSizeAcronym, {case n: Number => quote.bid.size = Some(sizeMultipler() * n.doubleValue())}), 
    ... 
    ... 
) 

for((k,v) <- map; action <- actions.get(k); _ <- action.lift(v)) 
    quote.changed = true; 

for конструкт здесь перебирает map ключевых значений, то (следующий уровень итерации, за возможных действий, доступных для ключа Если action обнаруживается, что частичная функция, она будет поднята, чтобы сделать его функцию от Any до Option[Unit]. таким образом, вы можете перебирать в дополнительном внутреннем уровне, так quote.changed = true только запускается, когда действие определяются для v.

+0

Спасибо, он выглядит круто, но я бы не получил его работу, объект домена не обновляется – carfield

+0

@carfield Не могли бы вы разместить объявление 'map'? –

+0

Это всего лишь var map = HashMap [String, Object](); – carfield

1

Что-то вроде этого возможно?

val handlers = Map[String, Number => Unit] (
    quoteBidPriceAcronym -> { n => quote.bid.price = Some(n.doubleValue) }, 
    quoteBidSizeAcronym -> { n => quote.bid.size = Some(sizeMultipler() * n.intValue }, 
etc. ... 
) 

for { 
    (k,handler) <- handlers 
    values <- map.get(k).toSeq 
    quote.chanded = true 
    _ = handler(n.asInstanceof[Number]) 
} 
+0

Не все из них должны быть экземплярами номера. – Ashalynd

+0

Ну, в этом вопросе, все они ... Если вам нужно обрабатывать разные типы, подумайте о том, чтобы иметь разные карты 'handlers', например, или использовать PartialFunctions в качестве другого ответа, предложенного ... хотя в этот момент я бы действительно рекомендую серьезно пересмотреть ваш дизайн. – Dima

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