无需迭代即可将List <Integer>转换为int [](数组)的有效方法

Tim*_*ian 15 java arrays list

  public static int[] convertListToArray(List<Integer> listResult) {
        int[] result = new int[listResult.size()];
        int i= 0;
        for (int num : listResult) {
            result[i++] = num;
        }
        return result;
    }
Run Code Online (Sandbox Code Playgroud)

有没有一种有效的方法将List转换为数组而不显式迭代List?也许可以通过使用以下方法:

Arrays.copyOf(int [] origin , int newLength );
System.arraycopy(Object src,  int  srcPos,
                                    Object dest, int destPos,
                                    int length);
Run Code Online (Sandbox Code Playgroud)

我知道,有记载的溶液在这里.但是,我特别感兴趣的是一种有效的转换List<Integer>方式int[]

Don*_*aab 11

如果效率是您最关心的问题,我认为您可以使用您的解决方案,并通过在listResult上使用索引for循环来提高效率RandomAccess.但是,这会使代码的可读性降低,并且您必须根据用例对其进行基准测试,以确定它是否更有效.

public static int[] convertListToArray(List<Integer> listResult) {
    int size = listResult.size();
    int[] result = new int[size];
    if (listResult instanceof RandomAccess)
    {
        for (int i = 0; i < size; i++)
        {
            result[i] = listResult.get(i);
        }
    }
    else
    {
        int i = 0;
        for (int num : listResult) {
            result[i++] = num;
        }
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

如果您使用Java 8并且想要编写更少的代码,则可以使用Streams库.

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int[] array = list.stream().mapToInt(i -> i).toArray();
Run Code Online (Sandbox Code Playgroud)

如果您愿意使用第三方库,则Eclipse Collections可以如下所示.

MutableList<Integer> list = Lists.mutable.with(1, 2, 3, 4, 5);
int[] array = list.collectInt(i -> i).toArray();
Run Code Online (Sandbox Code Playgroud)

以下是稍微多一点的代码,但是我可以使用Eclipse Collections来提出最有效的解决方案.

MutableList<Integer> list = Lists.mutable.with(1, 2, 3, 4, 5);
int[] array = new int[list.size()];
list.forEachWithIndex((each, index) -> array[index] = each);
Run Code Online (Sandbox Code Playgroud)

如果需要使用该java.util.List接口,可以从Eclipse Collections中使用ListIterate实用程序类.

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int[] array = new int[list.size()];
ListIterate.forEachWithIndex(list, (each, index) -> array[index] = each);
Run Code Online (Sandbox Code Playgroud)

ListIterate实用程序将对RandomAccess列表和非RandomAccess列表使用不同的迭代代码.

最有效的方法是将Eclipse Collections或另一个支持原始集合的库更改List<Integer>为a MutableIntList.

注意:我是Eclipse Collections的提交者.

  • 我更新了处理RandomAccess和非RandomAccess列表的答案.没有"保证"索引访问将更快,因此针对特定用例的基准测试将是显示它是否更快的唯一方法.https://docs.oracle.com/javase/8/docs/api/java/util/RandomAccess.html (2认同)

T.J*_*der 9

鉴于从需要转换Integerint,我不认为你会找到的东西比你有什么更有效的,如果我假设你在谈论执行效率。

可能会发现先转换为Integer[],然后循环可能更有效(如下),但您可能也没有。您必须在特定的情况下对其进行测试并查看。

这是一个例子:

int size = listResult.size();
int[] result = new int[size];
Integer[] temp = listResult.toArray(new Integer[size]);
for (int n = 0; n < size; ++n) {
    result[n] = temp[n];
}
Run Code Online (Sandbox Code Playgroud)


Sax*_*osh 8

在 Java 8 中:

int[] anArray = list.stream()
                    .filter(Objects::nonNull)
                    .mapToInt(Integer::intValue)
                    .toArray();
Run Code Online (Sandbox Code Playgroud)

  • Integers 列表可以包含 null 对象...并且 Integer::intValue 可以引发异常 (3认同)