我怎样才能重构`for`循环?

时间:2015-10-16 22:17:00

标签: java

问题

我希望能够将for循环拆分为方法,然后将for方法放在for循环中,以便于阅读。下面说明了这一点:

Example.java

for(int member = firstMember; member < arrayOfMembers.length; member++) {
    [...] other code
}

应该重构为:

解决方案示例:

private boolean eachMemberInList() {
       return int member = firstMember; member < arrayOfMembers.length; member++);
}

public static void main(String[] args) {
    for(eachMemberInList());
}

这可能吗?

3 个答案:

答案 0 :(得分:11)

不,您不能返回或以其他方式操纵for循环,就像它是Java中的对象一样。

但是,您尝试做的事情是不必要的。您可以直接在"enhanced" for loop, since Java 1.5中使用数组。

for (int member : arrayOfMembers) { ... }

它比尝试创建一个操作for循环的方法更简洁,它比您尝试替换的标准for循环更简洁。

答案 1 :(得分:3)

你正在谈论的是将for循环转变为while循环。

for (; true; )

相当于

while (true)

因此,您的解决方案可以被视为

while (someFunctionIsTrue()) {}

不想在这里进行宗教辩论,但一般来说,如果你在一系列对象上进行迭代,那么你真的想要使用for lop。不一定是因为它与使用您的解决方案的while循环有任何不同,但因为它是惯用的。当开发人员(经验丰富的开发人员)看到for循环时,您选择for循环的事实告诉他们一些东西。它说,嘿,我在迭代容器的对象。什么时候循环说,是有一些条件,虽然这种情况是真的做某事。

while循环和for循环的功能相同。通过惯用法使用它们,您可以更简洁,更清晰地传达您的代码。例如:

int index = 0;
while (index < array.size) {
    doSomethingWithArrayElement(array[index]);
    index++;
}

这不简洁。挂起变量声明创建了一行额外的代码,最后的索引++也是如此。当你这样做时:

for(int i = 0; i < array.size; i++) {
   doSomething(array[i]);
}

这非常简洁,你使用for循环...如果像这样使用,会立即告诉开发人员这个容器的所有项目都将完成它们!

现在让我们使用替代示例,其中我们有一个返回布尔值的函数。这个布尔值告诉循环是否继续。我们可以这样做:

int index = 0;
for (; doSomethingWithArrayItem(array, index); index++){
}

boolean doSomethingWithArrayItem(array, index) {
    //blah blah blah
    if (index + 1 == array.size) return false;
    return true;
}

这可以实现你想要的,但是很难遵循逻辑。让我们说你将doSomething函数命名为有用的东西,比如

incrementValueByTwo(item);

您认为这个功能有什么作用?它非常清楚正确。现在,让我们将此函数放在上面的for循环中:

int index = 0;
    for (; incrementValueByTwo(array, index); index++){
}

我们递增了多少个值?我们将数组的所有值递增2吗?他们中有一些?第一个?或者在某些情况下也许没有一个?这是非常混乱!!!!不要这样做!

答案 2 :(得分:0)

我宁愿做类似

的事情
String[] array = new String[10];

for(String variable : array){
     doSomething(variable);
}

或者,如果您使用的是Java 8,那么

Arrays.stream(array).forEach(memberOfArray -> doSomething(memberOfArray));

这更具可读性。