Scala 如何通过函数链接将初始值从过滤列表传递给foldLeft?

Scala 如何通过函数链接将初始值从过滤列表传递给foldLeft?,scala,functional-programming,Scala,Functional Programming,假设我有一个列表。在某些情况下,我会先过滤它。现在我想将这个过滤数组的初始值传递给foldLeft,同时将两者链接在一起。有办法吗 例如: scala> val numbers = List(5, 4, 8, 6, 2) val numbers: List[Int] = List(5, 4, 8, 6, 2) scala> numbers.filter(_ % 2 == 0).foldLeft(numbers(0)) { // this is obviously incorrect

假设我有一个
列表
。在某些情况下,我会先过滤它。现在我想将这个过滤数组的初始值传递给
foldLeft
,同时将两者链接在一起。有办法吗

例如:

scala> val numbers = List(5, 4, 8, 6, 2)
val numbers: List[Int] = List(5, 4, 8, 6, 2)

scala> numbers.filter(_ % 2 == 0).foldLeft(numbers(0)) { // this is obviously incorrect since numbers(0) is the value at index 0 of the original array not the filtered array
     |   (z, i) => z + i
     | }
val res88: Int = 25

您可以对过滤结果进行模式匹配,以获得列表的第一个元素(head)和其余元素(tail):

您也可以使用reduce:

numbers.filter(_ % 100 == 0).reduce {
   (z, i) => z + i
}

但如果筛选后列表为空,它将抛出异常。

您可以对筛选结果进行模式匹配,以获得列表的第一个元素(head)和其余元素(tail):

您也可以使用reduce:

numbers.filter(_ % 100 == 0).reduce {
   (z, i) => z + i
}

但如果筛选后列表为空,它将抛出异常。

可能只需使用
reduceLeft
,或者更好,您可以使用
.sum
。更好的方法是,一次完成所有操作
numbers.withFilter(%2==0)。sum
withFiler
是惰性的,如果有更多的步骤,可以使用迭代器,因此所有步骤都是惰性计算的)。-顺便说一句,将列表称为数组是令人困惑的。在折叠中使用第一个元素是非常不寻常的,通常使用零(或其他元素作为折叠操作的“空”)。你真的确定要这样做吗?@Suma@jwvh这只是一个简化的示例,我确实打算像这样使用
foldLeft
,但不是我在示例代码段中所显示的方式。也许只需使用
reduceLeft
,或者更好,你可以只使用
.sum
。更好的方法是,一次完成所有操作
numbers.withFilter(%2==0)。sum
withFiler
是惰性的,如果有更多的步骤,可以使用迭代器,因此所有步骤都是惰性计算的)。-顺便说一句,将列表称为数组是令人困惑的。在折叠中使用第一个元素是非常不寻常的,通常使用零(或其他元素作为折叠操作的“空”)。你真的确定要这样做吗?@Suma@jwvh这只是一个简化的示例,我确实打算像这样使用
foldLeft
,但不是我在示例代码段中所显示的方式。或者干脆
case nonempty@::=>nonempty.reduce
,或者干脆
case nonempty@::=>nonempty.reduce