问题

我有一个基元数组,例如int,int [] foo。它可能是一个小型的,或不是。

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

从中创建一个Iterable<Integer>的最佳方法是什么?

Iterable<Integer> fooBar = convert(foo);

笔记:

请不要回答使用循环(除非你可以很好地解释编译器如何对它们做一些聪明的事情?)

另请注意

int a[] = {1,2,3};
List<Integer> l = Arrays.asList(a);

甚至不会编译

Type mismatch: cannot convert from List<int[]> to List<Integer>

在回答之前也检查Why is an array not assignable to Iterable?

此外,如果你使用一些库(例如,番石榴),请解释为什么这是最好的。 (因为它来自谷歌不是一个完整的答案:P)

最后,由于似乎有关于此的功课,避免发布家庭作业代码。


#1 热门回答(86 赞)

Integer foo[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };

List<Integer> list = Arrays.asList(foo);
// or
Iterable<Integer> iterable = Arrays.asList(foo);

虽然你需要使用aIntegerarray(不是anintarray)来实现这一点。

对于原语,使用Guava:

Iterable<Integer> fooBar = Ints.asList(foo);
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>15.0</version>
    <type>jar</type>
</dependency>

#2 热门回答(37 赞)

只是我的2美分:

final int a[] = {1,2,3};

java.lang.Iterable<Integer> aIterable=new Iterable<Integer>() {

    public Iterator<Integer> iterator() {
       return new Iterator<Integer>() {
            private int pos=0;

            public boolean hasNext() {
               return a.length>pos;
            }

            public Integer next() {
               return a[pos++];
            }

            public void remove() {
                throw new UnsupportedOperationException("Cannot remove an element of an array.");
            }
        };
    }
};

#3 热门回答(24 赞)

使用Java 8,你可以执行此操作。

final int[] arr = {1, 2, 3};
final PrimitiveIterator.OfInt i1 = Arrays.stream(arr).iterator();
final PrimitiveIterator.OfInt i2 = IntStream.of(arr).iterator();
final Iterator<Integer> i3 = IntStream.of(arr).boxed().iterator();

原文链接