Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何减少提要处理程序字段处理的冗余_Scala_Feed - Fatal编程技术网

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的问题,而不是函数式编程

也就是说,我会改变您使用map
map
键的方式。我不需要检查是否存在值来执行某些操作,而需要从键到操作的映射,并迭代您的
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])
}