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


80

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

だから例えば、与えられた

Integer[] array

これをに変換する最も簡単な方法は何ですか

int[] intArray

残念ながら、これは、Hibernateと、制御できないサードパーティのライブラリとの間でインターフェイスするときに、非常に頻繁に行う必要があることです。これはごく一般的な操作のようですので、近道がないとびっくりします。

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

回答:


40

残念ながら、Javaプラットフォームにはこれを行うものはありません。ところで、配列null内の要素を明示的に処理する必要もありますInteger[]intそれらに何を使用しますか?)。


6
ヌルについての良い点。私の目的では、エントリの1つがnullの場合にスローされる例外を受け入れました。これは、オブジェクトのボックス化を解除したときにNullPointerExceptionがスローされるのと同じ方法です。
Il-Bhima

2
この答えは、Java 8では正確ではなくなりました。Alexの答えを参照してください。
robinst 2015年


70

ストリームがジャワ8で導入され、これは行うことができます。

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

しかし、そこの唯一のプリミティブストリームは現在intlongdoublebyte外部ライブラリを使用しない最短の方法など、別のプリミティブ型に変換する必要がある場合は、次のようになります。

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


2
の代わりにInteger::intValuei -> i(ボックス化解除を使用する)を使用することもできます。
robinst 2015年

1
@robinstそして、ボックス化解除はコンパイラーInteger::intValueがあなたを求めているので、メソッドがすぐに利用できるのに、なぜ新しいラムダを作成するのですか?
アンドレアス

@Andreas別のオプションをリストするだけです。どちらを選択するかは、コードスタイル/個人的な好みの問題です。また、2つのアプローチを(JMHを使用して)マイクロベンチマークしましたが、パフォーマンスは同じです。
ロビンスト2016年

投稿された最初のコードスニペットを使用すると、「静的コンテキストで非静的メソッドを使用できません」というエラーが表示されたので、代わりに次のようにしました。 int[] ints = Arrays.stream(objects).mapToInt(i -> Integer.parseInt(i.toString())).toArray(); これが同じ問題を抱えている人に役立つことを願っています。そして、誰かがより良い方法を知っているなら、私に知らせてください。
KartikChugh19年

これは、今日受け入れられている答えであるはずです。アレックスに感謝します。
パーLundbergの


3

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

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();
    }
}

もう1つの解決策は、事前定義されたアダプターが多数含まれているCommonsPrimitivesを使用することです。あなたの場合は、ListIntListを見てください


2

または、一度だけ実行する場合は、簡単な方法で実行してください。しかし、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++;
    }

1

ドルの使用は次のように簡単です。

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

6
これはJavaではないようです。少なくともJava1.6または1.7ではありません。
Lordalcol 2013年

2
@LorDalColドルは、実際のJavaライブラリです
ヤロスラフZáruba

1
Javaメソッドに名前を付けることができます$!しかし、それは奨励されていないと思います…
OleVV20年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.