Scala 如何减少提要处理程序字段处理的冗余
我是多个字段的消息提要的下标,我需要设置从提要到域对象的值,并具有如下代码:Scala 如何减少提要处理程序字段处理的冗余,scala,feed,Scala,Feed,我是多个字段的消息提要的下标,我需要设置从提要到域对象的值,并具有如下代码: if (map.contains(quoteBidPriceAcronym)) { quote.bid.price = Some(map.get(quoteBidPriceAcronym).get.asInstanceOf[Number].doubleValue()); quote.changed = true; } if (map.contains(quoteBidSizeAcronym)) { quot
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));
}
它看起来很多余,有什么改进的建议吗?您可以做如下操作:
map.get(quoteBidPriceAcronym).map { item =>
quote.bid.price = item.map(_.asInstanceOf[Number].doubleValue())
quote.changed = true
}
其他问题最好在外部解决。例如,如果你的代码假设它不会是无的,为什么map[quoteBidPriceAcronym]会存储一个选项?就个人而言,我不喜欢代码更改对象状态(
quote
),但这是Scala的问题,而不是函数式编程
也就是说,我会改变您使用mapmap
键的方式。我不需要检查是否存在值来执行某些操作,而需要从键到操作的映射,并迭代您的map
元素
e、 g(假设map
的类型为map[String,Any]
):
val操作:Map[String,PartialFunction[Any,Unit]]=Map(
(QuoteBidPrice缩写,{case n:Number=>quote.bid.price=Some(n.doubleValue())}),
(QuoteBidSizeAronym,{case n:Number=>quote.bid.size=Some(sizeMultipler()*n.doubleValue())}),
...
...
)
对于((k,v)这样的东西,也许
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])
}
val handlers=Map[String,Number=>Unit](
quoteBidPriceAcronym->{n=>quote.bid.price=Some(n.doubleValue)},
QuoteBidSizeAronym->{n=>quote.bid.size=Some(sizeMultipler()*n.intValue},
等
)
为了{
(k,handler)并不是所有的都应该是数字的例子。在这个问题上,它们都是……如果你需要处理不同的类型,考虑不同的<代码>处理程序< /Calp>地图,或者使用部分函数作为另一个答案……在这一点上,我真的建议认真考虑你的D。esign。它可以是None,不是吗?如果地图中不存在quoteBidPriceAcronym是的,但地图条目本身不必是一个选项,是吗?谢谢,它看起来很酷,但我不会让它工作,域对象不会工作updated@carfield你能发布你的map
声明吗?它只是var-map=HashMap[String,Object]();
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])
}