Scala vals vs vars
发布时间:2020-12-16 18:26:31 所属栏目:安全 来源:网络整理
导读:我对 Scala很新,但我想知道解决这个问题的首选方法是什么.假设我有一个项目列表,我想知道检查项目的总数.我可以这样做: val total = items.filter(_.itemType == CHECK).map(._amount).sum 这将给我我需要的东西,即不可变变量中所有检查的总和.但它看起来像
我对
Scala很新,但我想知道解决这个问题的首选方法是什么.假设我有一个项目列表,我想知道检查项目的总数.我可以这样做:
val total = items.filter(_.itemType == CHECK).map(._amount).sum 这将给我我需要的东西,即不可变变量中所有检查的总和.但它看起来像是3次迭代.一旦过滤检查,再次映射金额,然后总和.另一种方法是做一些事情: var total = new BigDecimal(0) for ( item <- items if item.itemType == CHECK ) total += item.amount 这给了我相同的结果,但是1次迭代和一个可变变量看起来也很好.但是,如果我想提取更多信息,比如支票总数,那就需要更多的计数器或可变变量,但我不必再次遍历列表.似乎不是实现我需要的“功能”方式. var numOfChecks = 0 var total = new BigDecimal(0) items.foreach { item => if (item.itemType == CHECK) { numOfChecks += 1 total += item.amount } } 因此,如果您发现自己需要在列表中使用一堆计数器或总计,则首选保留可变变量或不担心它会执行以下操作: val checks = items.filter(_.itemType == CHECK) val total = checks.map(_.amount).sum return (checks.size,total) 这似乎更容易阅读,只使用vals 解决方法
您可以使用foldLeft:
(0 /: items) ((total,item) => if(item.itemType == CHECK) total + item.amount else total ) 以下代码将返回一个元组(支票数量 – >金额总和): ((0,0) /: items) ((total,item) => if(item.itemType == CHECK) (total._1 + 1,total._2 + item.amount) else total ) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |