我是许多字段的消息提要的下标,我需要将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));
}
看起来很多余,有什么建议可以改进吗?
答案 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
,那么一个部分函数,它被取消使它成为一个从Any
到Option[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])
}