webdevqa.jp.net

オブジェクトの配列をプリミティブ型の配列に変換する

Javaプリミティブ型(Byte、Integer、Charなど)を持つオブジェクトの配列がある場合。それをプリミティブ型の配列に変換できる適切な方法はありますか?特に、これは、新しい配列を作成してコンテンツをループすることなく実行できます。

例えば、与えられた

Integer[] array

これを変換する最も近い方法は何ですか

int[] intArray

残念ながら、これは、Hibernateと私たちが制御できないサードパーティのライブラリとの間でインターフェースをとるときに、非常に頻繁に行わなければならないことです。これは非常に一般的な操作と思われるため、ショートカットがない場合は驚かされます。

ご協力いただきありがとうございます!

76
Il-Bhima

残念ながら、これを行うJavaプラットフォームには何もありません。また、null要素をInteger[]配列(これらに使用するintは何ですか?)。

39
Zach Scrivena

繰り返しますが、 Apache Commons Lang はあなたの友人です。これらは ArrayUtils.toPrimitive() を提供します。これはまさに必要なことを行います。 NULLの処理方法を指定できます。

88
Guillaume

streams で導入されたJava 8でこれを行うことができます:

int[] intArray = Arrays.stream(array).mapToInt(Integer::intValue).toArray();

ただし、現在、intlong、およびdoubleのプリミティブストリームのみがあります。 byteなどの別のプリミティブ型に変換する必要がある場合、外部ライブラリを使用しない最短の方法は次のとおりです。

byte[] byteArray = new byte[array.length];
for(int i = 0; i < array.length; i++) byteArray[i] = array[i];

または、必要に応じてforループをストリームに置き換えることができます。

IntStream.range(0, array.length).forEach(i -> byteArray[i] = array[i]);

要素のいずれかがNullPointerExceptionである場合、これらはすべてnullをスローします。

61
Alex

Guava を使用:

int[] intArray = Ints.toArray(Arrays.asList(array));

ドキュメンテーション:

24
Paul Bellora

特に、新しい配列を作成して内容をループすることなくこれを実行できます。

Javaでは、整数の配列をintに変換することはできません(つまり、配列の要素の型を変更することはできません)。したがって、新しいint []配列を作成し、Integerオブジェクトの値をその配列にコピーするか、アダプターを使用する必要があります。

class IntAdapter {
    private Integer[] array;
    public IntAdapter (Integer[] array) { this.array = array; }
    public int get (int index) { return array[index].intValue(); }
}

これにより、コードが少し読みやすくなり、IntAdapterオブジェクトは数バイトのメモリしか消費しません。アダプタの大きな利点は、ここで特別なケースを処理できることです。

class IntAdapter {
    private Integer[] array;
    public int nullValue = 0;
    public IntAdapter (Integer[] array) { this.array = array; }
    public int get (int index) { 
        return array[index] == null ? nullValue : array[index].intValue();
    }
}

別の解決策は、 Commons Primitives を使用することです。これには、多くの定義済みアダプターが含まれています。あなたの場合、 ListIntList を見てください。

3
Aaron Digulla

または、一度だけ行う場合は、簡単な方法で行います。ただし、Integer!= nullの場合については説明していません。

    //array is the Integer array
    int[] array2 = new int[array.length];
    int i=0;
    for (Integer integer : array) {
        array2[i] = integer.intValue();
        i++;
    }
2
Jens Jansson

Dollar を使用するのは簡単です:

Integer[] array = ...;
int[] primitiveArray = $(array).toIntArray();
1
dfa