Search code examples
c#java.netlanguage-featuresenumerable

Is there anything like Enumerable.Range(x,y) in Java?


Is there something like C#/.NET's

IEnumerable<int> range = Enumerable.Range(0, 100); //.NET

in Java?


Solution

  • As Java 8, this is possible with java.util.stream.IntStream.range(int startInclusive, int endExclusive)

    Before Java8:

    There is not such thing in Java but you can have something like this:

    import java.util.Iterator;
    
    public class Range implements Iterable<Integer> {
        private int min;
        private int count;
    
        public Range(int min, int count) {
            this.min = min;
            this.count = count;
        }
    
        public Iterator<Integer> iterator() {
            return new Iterator<Integer>() {
                private int cur = min;
                private int count = Range.this.count;
                public boolean hasNext() {
                    return count != 0;
                }
    
                public Integer next() {
                    count--;
                    return cur++; // first return the cur, then increase it.
                }
    
                public void remove() {
                    throw new UnsupportedOperationException();
                }
            };
        }
    }
    

    For example you can use Range by this way:

    public class TestRange {
    
        public static void main(String[] args) {
            for (int i : new Range(1, 10)) {
                System.out.println(i);
            }
        }
    
    }
    

    Also if you don't like use new Range(1, 10) directly, you can use factory class for it:

    public final class RangeFactory {
        public static Iterable<Integer> range(int a, int b) {
            return new Range(a, b);
        }
    }
    

    And here is our factory test:

    public class TestRangeFactory {
    
        public static void main(String[] args) {
            for (int i : RangeFactory.range(1, 10)) {
                System.out.println(i);
            }
        }
    
    }