如何在Scala中做这样的事情?

时间:2009-10-01 03:00:47

标签: scala

很抱歉缺少描述性标题;我想不出更好的事情。如果你想到的话就编辑它。

假设我有两个List个对象,它们总是在变化。它们需要作为单独的列表保留,但是必须对它们进行许多操作。这导致我做了类似的事情:

//assuming A and B are the lists
A.foo(params)
B.foo(params)

换句话说,我在代码中的许多地方对两个不同的列表执行完全相同的操作。我想要一种方法将它们减少到一个列表,而不必明确地构建另一个列表。我知道只需将列表Ab合并到列表C中即可解决我的所有问题,但如果我需要添加新的问题,我们就会回到相同的操作对象列表(因为我必须将它添加到C及其各自的列表中。)

这是一个紧凑的循环,性能非常重要。有没有办法构造迭代器或迭代A然后继续B的东西,所有这些都是透明的?我知道另一种解决方案是每次我想在这两个列表上执行某种功能时构造组合列表(C),但这是浪费大量时间(从计算上讲)。 / p>

2 个答案:

答案 0 :(得分:4)

Iterator就是你需要的。将列表转换为迭代器并连接2个迭代器都是O(1)操作。

scala> val l1 = List(1, 2, 3)
l1: List[Int] = List(1, 2, 3)

scala> val l2 = List(4, 5, 6)
l2: List[Int] = List(4, 5, 6)

scala> (l1.iterator ++ l2.iterator) foreach (println(_)) // use List.elements for Scala 2.7.*
1
2
3
4
5
6

答案 1 :(得分:2)

我不确定我是否明白你的意思是什么。 无论如何,这是我的解决方案:

scala> var listA :List[Int] = Nil
listA: List[Int] = List()

scala> var listB :List[Int] = Nil
listB: List[Int] = List()

scala> def dealWith(op : List[Int] => Unit){ op(listA); op(listB) }
dealWith: ((List[Int]) => Unit)Unit

然后如果你想在listA和listB中执行一个运算符,你可以使用如下:

scala> listA ::= 1
scala> listB ::= 0
scala> dealWith{ _ foreach println }
1
0