我已经了解了foldLeft和reducleft的基本区别
foldLeft:
必须传递初始值
reduceLeft:
以集合的第一个元素作为初始值 如果集合为空,则抛出异常
还有其他区别吗?
有什么特殊的原因要有两个功能相似的方法吗?
我已经了解了foldLeft和reducleft的基本区别
foldLeft:
必须传递初始值
reduceLeft:
以集合的第一个元素作为初始值 如果集合为空,则抛出异常
还有其他区别吗?
有什么特殊的原因要有两个功能相似的方法吗?
当前回答
reducleft只是一个方便的方法。它等价于
list.tail.foldLeft(list.head)(_)
其他回答
为了真正理解折叠/缩减的作用, 检查这个:http://wiki.tcl.tk/17983 非常好的解释。一旦你掌握了折叠的概念, Reduce会和上面的答案一起出现: list.tail.foldLeft (list.head) (_)
它们都在Scala标准库中的基本原因可能是因为它们都在Haskell标准库中(称为foldl和foldl1)。如果reducleft不是,那么在不同的项目中,它通常被定义为一个方便的方法。
reducleft只是一个方便的方法。它等价于
list.tail.foldLeft(list.head)(_)
作为参考,如果将reduceLeft应用于空容器,将出现以下错误。
java.lang.UnsupportedOperationException: empty.reduceLeft
重写要使用的代码
myList foldLeft(List[String]()) {(a,b) => a+b}
是一个潜在的选择。另一种方法是使用reduceLeftOption变体,它返回一个Option包装的结果。
myList reduceLeftOption {(a,b) => a+b} match {
case None => // handle no result as necessary
case Some(v) => println(v)
}
规模2.13.3,演示:
val names = List("Foo", "Bar")
println("ReduceLeft: "+ names.reduceLeft(_+_))
println("ReduceRight: "+ names.reduceRight(_+_))
println("Fold: "+ names.fold("Other")(_+_))
println("FoldLeft: "+ names.foldLeft("Other")(_+_))
println("FoldRight: "+ names.foldRight("Other")(_+_))
输出:
ReduceLeft: FooBar
ReduceRight: FooBar
Fold: OtherFooBar
FoldLeft: OtherFooBar
FoldRight: FooBarOther