For 循环 - 像 Python 范围函数

2022-09-01 06:20:46

我想知道在Java中是否有像python range函数这样的函数。

range(4)

它会回来的

[0,1,2,3]

这是增强循环的简单方法。在Java中执行此操作会很棒,因为它会使循环变得容易得多。这可能吗?


答案 1

Java 8(2014)添加了IntStream(类似于apache commons IntRange),所以你现在不需要外部lib。

import java.util.stream.IntStream; 

IntStream.range(0, 3).forEachOrdered(n -> {
    System.out.println(n);
});

forEach如果顺序不重要,也可以使用代替。forEachOrdered

IntStream.range(0, 3).parallel()可用于并行运行的循环


答案 2

在没有外部库的情况下,您可以执行以下操作。对于大范围,它将比当前接受的答案消耗更少的内存,因为没有创建数组。

有一个这样的类:

class Range implements Iterable<Integer> {

    private int limit;

    public Range(int limit) {
        this.limit = limit;
    }

    @Override
    public Iterator<Integer> iterator() {
        final int max = limit;
        return new Iterator<Integer>() {

            private int current = 0;

            @Override
            public boolean hasNext() {
                return current < max;
            }

            @Override
            public Integer next() {
                if (hasNext()) {
                    return current++;   
                } else {
                    throw new NoSuchElementException("Range reached the end");
                }
            }

            @Override
            public void remove() {
                throw new UnsupportedOperationException("Can't remove values from a Range");
            }
        };
    }
}

你可以简单地像这样使用它:

    for (int i : new Range(5)) {
        System.out.println(i);
    }

您甚至可以重复使用它:

    Range range5 = new Range(5);

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

正如Henry Keiter在下面的评论中指出的那样,我们可以将以下方法添加到类中(或其他任何地方):Range

public static Range range(int max) {
    return new Range(max);
}

然后,在其他类中,我们可以

import static package.name.Range.range;

并简单地调用

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