我有一个集合,我想映射到一个新集合,但是每个结果值都以某种方式依赖于它之前的值。我可以用 leftFold 解决这个问题
val result:List[B] = (myList:List[A]).foldLeft(C -> List.empty[B]){
case ((c, list), a) =>
..some function returning something like..
C -> (B :: list)
}
这里的问题是我需要遍历整个列表来检索结果列表。假设我想要一个将 TraversableOnce[A] 映射到 TraversableOnce[B] 并且只评估我调用的成员的函数?在我看来,这似乎是一个相当传统的问题,所以我想知道是否有一种通用的方法来解决这个问题。我目前拥有的是:
implicit class TraversableOnceEx[T](val self : TraversableOnce[T]) extends AnyVal {
def foldyMappyFunction[A, U](a:A)(func:(A,T) => (A,U)):TraversableOnce[U] = {
var currentA = a
self.map { t =>
val result = func(currentA, t)
currentA = result._1
result._2
}
}
}
就功能纯度而言,您无法并行运行它,但除此之外它看起来很合理。
一个例子是;将每个元素返回给我,如果这是该元素之前第一次出现。
val elements:TraversableOnce[E]
val result = elements.mappyFoldyFunction(Set.empty[E]) {
(s, e) => (s + e) -> (e -> s.contains(e))
}
result:TraversableOnce[(E,Boolean)]