在Java中是否有一种更短的方式来编写for循环?

8

代码如下:

 for(int i = 0; i < max; i++) {
    //do something
 }

我在编程时经常使用这段代码,总是从0开始,使用间隔i++。实际上只有一个变量会改变(max)。

虽然这段代码无法更短,但考虑到它被经常使用,简化一下还是很有用的。

我知道在Python中有range函数,可以更快地输入。


2
根据情况可以使用for each循环或Java 8流 - Andrew Jenkins
5
你可以编写自己的简化函数 doInRange(int max, IntConsumer whatToDo)。该函数可以接收一个最大值参数和一个执行操作的函数参数。 - tobias_k
每个循环都使用静态函数?相信我,这不是一个好的模式! - Piotrowy
你想在100个类中如何使用它?这会让人毛骨悚然。 - Piotrowy
有点毛骨悚然,但很有趣。我同意这可能不是一个好主意,但我真的想看看它。 - byxor
显示剩余3条评论
7个回答

12

在遍历集合时,可以使用增强型循环:

int[] numbers = 
 {1,2,3,4,5,6,7,8,9,10};

for (int item : numbers) {
   System.out.println(item);
}

1
没错,但如果我想要1000次迭代呢?没有人会费力写出1000个数组元素。迭代次数也是在编译时固定的。--- 如果我们有一个预处理器就好了!开玩笑的,我们不妨换成C++来实现。 - byxor
我只是举了一个例子。增强型循环可用于任何集合——主要是for(int item : numbers)的语法,而不是使用类似for(int i = 0; i < collection.size(); i++){} :)这样的语法。 - Abdulgood89

8
如果您使用Java 8,您可以使用IntStream.range(min, max).foreach(i ->{})

5
楼上的回答是:OP 特别要求更简短的方式。据我所知,IntStream.range(min, max).foreach(() -> 不比 for(int i = 0; i < max; i++) 更短 :) - yshavit
1
我个人也不认为这更易读。:) 但这涉及到观点的领域。我已经阅读了超过25年的for循环,所以它们在这一点上非常自然,特别是当它们遵循标准的“0; < max; ++”模式时。 - yshavit
1
如果你花了25年时间阅读“for”循环,那么你可以花费两天的时间去学习Java中的lambda函数和流式处理。它真的非常有用。 - Piotrowy
1
它们很有用,但是将它们用作替代每个for循环的做法是非常糟糕的。一旦你有了一个嵌套层级,你的代码就会变得完全无法阅读。 - luk2302
1
哦,我知道它们。我并不认为你写的代码更易读,但也不认为它比原来更难读。而且,从字符计数的角度来看,它肯定不会更短。 - yshavit
显示剩余5条评论

6

由于有些人要求这样做,这里提供一些你可以做的事情,尽管这些是否真正更好还有待商榷,也是品味的问题:

void times(int n, Runnable r) {
    for (int i = 0; i < n; i++) {
        r.run();
    }
}

使用方法:

times(10, () -> System.out.println("Hello, world!"));

或者:

void times(int n, IntConsumer consumer) {
    for (int i = 0; i < n; i++) {
        consumer.accept(i);
    }
}

使用方法:

times(10, x -> System.out.println(x+1));

或者:

void range(int lo, int hi, IntConsumer consumer) {
    for (int i = lo; i < hi; i++) {
        consumer.accept(i);
    }
}

使用方法:

range(1, 11, x -> System.out.println(x));

这些只是一些想法。如果经过深思熟虑,放置到一个公共库中并且一直使用,它们可以使常见的习惯性代码简洁易读。但如果使用不当,它们可能会将本来简单明了的代码变成难以管理的混乱。我怀疑任何两个开发者都不会完全同意应该在哪里划线。


1
好的,问题要求“更短”,而不是“更好”,所以是的,那将是完美的解决方案。 - Hasen

4

有一种方法可以编写更短的for循环。

如果你关注“for”循环,你可能会发现这很有趣。

for(int i = -1; ++i < max;) {
    //do something
 }

注意在与最大值进行比较之前,计数器已经增加。

同时注意索引i从-1开始,而不是通常的0。


0
在许多情况下,最大值是未知的(来自文件、数据库等数据)。 对我来说,最好的方法是将所有内容加载到列表(ArrayList 等)中,并使用 for-each 循环。在我的观点中,循环遍历集合是缩短循环语法的最佳方式。

如果所有数据都适合内存,那就没问题了,虽然将从文件读取的东西转换为首先加载到列表中的东西意味着它必须全部适合内存,而之前则不一定需要。 - David Conrad
可以,但是你可以部分加载数据,并在for-each循环中使用它们。 - Ksiądz Pistolet
你的意思是像堆栈一样吗? - Ellisan

0
我想到的for循环快捷方式是:for (int i : val),这对我来说非常好用。以以下代码为例:
for (int i = 0; x < val.length; i++)
System.out.print(val[i] + ", ");

等同于

for (int i : val)
System.out.print(i + ", ");

经过一些研究,我发现这个链接有增强型for循环的示例。这种写法看起来非常类似于在Linux Bash中编写for循环的方法。


不适用于Java。 - Anderson

0

你可以使用这种方式来处理列表

普通模式:

List<String> myList = Arrays.asList(new String[]{"a","b","c","d","e","f"});
for (int i=0;i<myList.size();i++){
    System.out.println(myList.get(i));
}

简短模式1:

List<String> myList = Arrays.asList(new String[]{"a","b","c","d","e","f"});
myList.forEach((node)->{
    System.out.println(node);
});

简短模式2:

List<String> myList = Arrays.asList(new String[]{"a","b","c","d","e","f"});
for(String node: myList){
   System.out.println(node);
}

更短的写法是:myList.forEach(System.out::println); - Arvind Kumar Avinash
当然,这取决于循环中的行数。 - Farhad Ziaee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接