将 Java 数组转换为可迭代

2022-08-31 06:56:24

我有一个基元数组,例如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>

在回答之前,还要检查为什么数组不可分配给迭代?

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

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


答案 1
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);

虽然你需要使用一个数组(而不是数组)才能做到这一点。Integerint

对于原语,您可以使用番石榴:

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

对于带有 lambdas 的 Java8:(灵感来自 Jin Kwon 的答案)

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

答案 2

只是我的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.");
            }
        };
    }
};