如何减少Feed处理程序

时间:2015-12-29 14:33:26

标签: scala feed

我是许多字段的消息提要的下标,我需要将Feed中的值设置为域对象,并具有如下代码:

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));
}

看起来很多余,有什么建议可以改进吗?

3 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

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

其他问题可能更适合在外面修复。例如。为什么map [quoteBidPriceAcronym]存储一个Option,如果你的代码认为它不会是None?

答案 1 :(得分: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,那么一个部分函数,​​它被取消使它成为一个从AnyOption[Unit]的函数。这样,​​你可以迭代一个额外的内部级别,所以quote.changed = true只在定义了动作时运行v

答案 2 :(得分: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])
}