【发布时间】:2013-05-02 13:00:00
【问题描述】:
示例
此测试失败,因为each 没有修改列表的元素。
void test_each_DoesNotModifyListElements() {
List<String> list = ["a", "b", "c"]
list.each { it = it + "z" }
assert ["az", "bz", "cz"] == list
}
这个测试通过了,因为collect 返回了一个包含修改过的元素的新列表。
void test_collect_ReturnsNewListWithModifiedElements() {
List<String> list = ["a", "b", "c"]
list = list.collect{ it + "z" }
assert ["az", "bz", "cz"] == list
}
假设
此时,我假设 each 不会修改列表的元素,因为我已经编写了下面的测试,并且我假设这就是测试告诉我的。如果我错了,请纠正我。
void test_each_DoesNotModifyListElements1() {
List<String> list = ["a", "b", "c"]
list.each { it + "z" }
assert ["az", "bz", "cz"] == list
}
void test_each_DoesNotModifyListElements2() {
List<String> list = ["a", "b", "c"]
list.each { it = it + "z" }
assert ["az", "bz", "cz"] == list
}
void test_each_DoesNotModifyListElements3() {
List<String> list = ["a", "b", "c"]
list = list.each { it = it + "z" }
assert ["az", "bz", "cz"] == list
}
问题
所以问题是:作为一个 Groovy 初学者,我应该如何事先知道,即在编写测试和googling 之前,each 不会更改列表的元素?
通过阅读文档?
Groovy each documentation:遍历聚合类型或数据结构,传递每个 项目到给定的闭包。自定义类型可以通过以下方式使用此方法 只需提供一个“iterator()”方法。退回的物品 生成的迭代器将被传递给闭包。
通常,我最终会花费大量时间尝试各种事情并在谷歌上搜索答案。不应该有更有效的方法吗?有吗?
【问题讨论】:
-
您是否希望
for循环能够在 Java 中更改 List 的元素? -
@tim_yates:我想说...是吗?你是这个意思吗?
void test_for_loop() { List<String> list = ["a", "b", "c"] for (int i = 0; i < list.size(); i++) { list[i] = list[i] + "z" } assert ["az", "bz", "cz"] == list } -
啊,但是你在循环中改变了
list,在你上面的each例子中,你没有提到list本身 -
如果你想要
list = [ 'a', 'b', 'c' ] ; list.eachWithIndex { it, idx -> list[ idx ] = it + 'z' },你也可以使用each,但使用collect会更好 -
相同的值,但与
each中的语义不同,该值已作为参数传递到each闭包中,因此任何更改都将丢失(与Java 中的任何方法调用一样) .使用 for 循环,您正在修改位置[0]的列表的实际内容。
标签: groovy