为什么java数字不可迭代

时间:2011-05-02 15:22:57

标签: java foreach primitive-types

我不禁想知道为什么我不能写那样的东西:

for (int i : 3) {
  System.out.println(i);
}

打印出来:

0
1
2

我的意思是,3可以自动装入Integer,可以是Iterable。 我知道,我已经选择了第一个元素0,但我认为这是常见的情况,并且它可以利用这种ForEach构造进行倒计时。

7 个答案:

答案 0 :(得分:10)

这有点愚蠢,但你可以这样写:

    for (int i : iter(3)) {
        System.out.println(i);  // 0, 1, 2
    }

    for (int i : iter(-5)) {
        System.out.println(i);  // 0, -1, -2, -3, -4
    }

    for (int i : iter(1, 7)) {
        System.out.println(i);  // 1, 2, 3, 4, 5, 6
    }

如果您要静态导入方法:

import static your.package.IterUtil.iter;

来自此自定义类:

public class IterUtil {

    public static Iterable<Integer> iter(int to) {
        return new IntIterable(0, to);
    }

    public static Iterable<Integer> iter(int from, int to) {
        return new IntIterable(from, to);
    }


    private static class IntIterable implements Iterable<Integer> {

        private int start;
        private int end;

        private IntIterable(int start, int end) {
            this.start = start;
            this.end = end;
        }

        @Override
        public Iterator<Integer> iterator() {
            return new Iterator<Integer>() {
                private int actual = start;

                @Override
                public boolean hasNext() {
                    return actual != end;
                }

                @Override
                public Integer next() {
                    int value = actual;

                    if (actual < end) {
                        actual++;
                    } else if (actual > end) {
                        actual--;
                    }

                    return value;
                }

                @Override
                public void remove() {
                    // do nothing
                }
            };
        }
    }
}

答案 1 :(得分:9)

因为数字不是范围。将数字转换为范围是不明确的。 没有什么可以阻止你编写 可迭代的Range类,例如

public class IntegerRange implements Iterable<Integer> {
  private final int _fromInclusive;
  private final int _toExclusive;

  public IntegerRange(int fromInclusive, int toExclusive) {
    _fromInclusive = fromInclusive;
    _toExclusive = toExclusive;
  }

  public Iterator<Integer> iterator() {
    return new Iterator<Integer>() {
      int c = _fromInclusive;
      public boolean hasNext() {
        return c < _toExclusive;
      }

      public Integer next() {
        if (c >= _toExclusive) {
          throw new NoSuchElementException();
        }
        return c++;
      }

      public void remove() {
        throw new UnsupportedOperationException();
      }
    };
  }
}

请注意,使用这种方法,您可以轻松添加功能,例如指定增量,范围是否包含在两侧等等。

答案 2 :(得分:4)

for(x : c)语法中,c必须是Iterable; 3不是。 你可以做到

    for (int i : new int[]{0,1,2}) {
          System.out.println(i);
     }

答案 3 :(得分:4)

迭代对象集合。和Integer是一个单独的Object,没有什么可以迭代的。但是,您可以这样做:

for(int i=0;i<number;i++)

答案 4 :(得分:4)

在java中,foreach循环只迭代数组,或者实现Iterable接口的集合,而包装类型Integer则没有。

但是当你想到它时,这是有道理的。什么“对于3中的每个整数,这样做”是什么意思? 3中有多少个整数 ?我们从零开始,所以有4个整数(0,1,2,3)?我们从1开始吗?我们必须一个接一个地走吗?

如果你想模仿那种行为,TheOtherGuy的答案会起作用,但一个简单的for循环可能更好。

答案 5 :(得分:2)

正如其他人所指出的那样,Java for-each遍历数组或集合。 “3”不是数组或集合,它是单个值。如果Java允许你建议的构造,唯一一致的实现就是“迭代”单个值,即3.

for (int i : 3) {   System.out.println(i); } 

会输出:

3

这似乎没有用,这可能就是他们没有实现的原因。

您的问题假设像“3”这样的单个值意味着范围。但为什么你会假设{0,1,2,3}?为什么不{1,2,3}?或{-3,-2,-1,0,1,2,3}?或{0.5,1.0,1.5,2.0,2.5,3}?或者无数其他可能的变化。

要使其具体化,您必须指定起始值,结束值和增量。嗯,也许我们可以想出这样的符号:

for (int i=0,3,1)

但那仍然含糊不清。目前尚不清楚我们是否要继续直到i == 3,或直到最后一个值<3。我们可能需要区分加号和减号。那么这个更灵活的符号怎么样:

for (int i=0; i<=3; i=i+1)

哦,等等,已经支持了。 : - )

答案 6 :(得分:1)

Number具有非整数子类,例如Float和BigDecimal,因此在Number上实现Iterable <Integer>没有意义。有Integer和Long实现Iterable <Integer|Long&gt;会很好。