【问题标题】:Is there a shorter way to write a for loop in Java?有没有更短的方法在 Java 中编写 for 循环?
【发布时间】:2017-06-23 23:37:05
【问题描述】:

代码是

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

我在编程时多次使用这个确切的代码,总是从 0 开始并使用区间 i++。实际上只有一个变量会改变(最大值)

不能再短了,但考虑到这段代码的使用量,它会很有帮助。

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

【问题讨论】:

  • 根据情况可以使用 for each 循环或Java 8 streams
  • 如果您使用的是 Eclipse IDE,则有一个 for 循环的捷径。这样,您只需键入几个字符即可完成。
  • 你也可以自己写速记函数doInRange(int max, IntConsumer whatToDo)
  • @tobias_k 请为此写一个答案。我真的很喜欢那种模式的声音。
  • 每个循环的静态函数?相信我,这不是一个好的模式!

标签: java for-loop syntax shorthand


【解决方案1】:

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

如果关注的是“for”循环,您可能会觉得这很有趣

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

请注意,计数器增量是在与 max 比较之前完成的。

还要注意索引 i 从 -1 而不是正常的 0 开始。

【讨论】:

    【解决方案2】:

    List 可以用这种方式

    普通模式:

    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);
    • 当然要看循环的行数
    【解决方案3】:

    我想到的 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 + ", ");
    

    经过一番研究,我发现了这个 link 带有 EnhancedFor 的示例。这种写for循环的方式看起来和写for in Linux Bash的方式很相似。

    【讨论】:

    • 不适用于 java。
    【解决方案4】:

    由于一些人要求这样的东西,这里有一些你可以做的事情,尽管这些是否真的更好是有争议的并且是品味问题:

    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));
    

    这些只是一些想法。经过深思熟虑的设计,放置在通用库中并一致使用,它们可以使通用、惯用的代码简洁易读。如果使用不慎,它们可能会将原本简单的代码变成难以管理的混乱。我怀疑任何两个开发人员都不会就应该在哪里画线达成一致。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 如果所有数据都适合内存,那很好,尽管将从文件读取的内容转换为首先将所有内容加载到列表的内容意味着它必须都适合内存,其中在它不一定必须之前。
      • 可以,但您可以部分加载数据,并在 for-each 循环中使用它们。
      • 你的意思是像一堆?
      【解决方案6】:

      如果你使用Java 8,你可以使用IntStream.range(min, max).foreach(i -&gt;{})

      【讨论】:

      • OP 专门要求更短的方式。据我统计,IntStream.range(min, max).foreach(() -&gt; 不短于for(int i = 0; i &lt; max; i++) :)
      • 我个人也不认为这更具可读性。 :) 但这进入了意见领域。我已经阅读for 循环超过 25 年了,所以在这一点上它们是相当第二天性的,尤其是当它们遵循标准的 "0;
      • 如果你花了 25 年时间阅读 for 循环,你可以花 2 天时间来学习 java 和流中的 lambda 函数。真的很有用。
      • 它们很有用,但是用它们代替你拥有的每个 for 循环是一个非常糟糕的主意。只要你有一层嵌套,你的代码就会变得完全不可读。
      • 哦,我知道他们。我不觉得你写的 less 可读,我只是不觉得它 more 可读,要么。算上字符,它肯定不会更短。
      【解决方案7】:

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

      int[] numbers = 
       {1,2,3,4,5,6,7,8,9,10};
      
      for (int item : numbers) {
         System.out.println(item);
      }
      

      【讨论】:

      • 是的,但是如果我想要 1000 次迭代怎么办?没有人会费心写出数组的 1000 个元素。迭代次数也在编译时固定。 --- 要是我们有一个预处理器就好了!开个玩笑,我们不妨换成 C++。
      • 好吧,我只是以这个为例。增强循环可用于任何集合 - 重点是 for(int item : numbers) 的语法,而不是使用类似 for(int i = 0; i
      猜你喜欢
      • 2023-03-03
      • 2017-02-18
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      相关资源
      最近更新 更多