我是Scala的新手,我一直在为Option和List苦苦挣扎。我有以下对象:
object Person {
case class Person(fName: String,
lName: String,
jeans: Option[Jeans],
jacket: Option[Jacket],
location: List[Locations],
age: Int)
case class Jeans(brand: String, price: Int, color: String)
...
}
而且我正在尝试编写将人类型输入列表并返回牛仔裤平均价格的函数:
def avgPriceJeans(input: List[Person]): Int
当您有一个list值并且想要将所有值减少为一个值时,请执行某种操作。您需要一个fold
,最常见的是foldLeft
。
您可以在scaladoc中看到。该方法接收初始值和组合函数。显而易见,初始值应为zero
。并且组合功能应该利用当前的积累,并增加当前牛仔裤的价格。
尽管如此,现在我们还有另一个问题,牛仔裤可能存在或可能不存在,因此我们使用option。在这种情况下,我们需要一种方法来说明它们是否存在,如果没有给出默认值(在这种情况下,可以认为是另一个zero
),则可以给我它们的价格。而这正是Option.fold
给我们的。
因此,我们以类似这样的结尾:
Option.fold
现在您需要平均值,只需要将该和除以计数即可。
但是,我们可以在相同的val sum = input.foldLeft(0) {
(acc, person) =>
acc + person.jeans.fold(ifEmpty = 0)(_.price)
}
中进行计数,只是为了避免额外的迭代。(为了确保准确的结果,我将返回类型以及foldLeft
属性更改为Double,以确保获得准确的结果)]]。>>price