Javaプリミティブ型(Byte、Integer、Charなど)を持つオブジェクトの配列がある場合。それをプリミティブ型の配列に変換できる適切な方法はありますか?特に、これは、新しい配列を作成してコンテンツをループすることなく実行できます。
例えば、与えられた
Integer[] array
これを変換する最も近い方法は何ですか
int[] intArray
残念ながら、これは、Hibernateと私たちが制御できないサードパーティのライブラリとの間でインターフェースをとるときに、非常に頻繁に行わなければならないことです。これは非常に一般的な操作と思われるため、ショートカットがない場合は驚かされます。
ご協力いただきありがとうございます!
残念ながら、これを行うJavaプラットフォームには何もありません。また、null
要素をInteger[]
配列(これらに使用するint
は何ですか?)。
繰り返しますが、 Apache Commons Lang はあなたの友人です。これらは ArrayUtils.toPrimitive() を提供します。これはまさに必要なことを行います。 NULLの処理方法を指定できます。
streams で導入されたJava 8でこれを行うことができます:
int[] intArray = Arrays.stream(array).mapToInt(Integer::intValue).toArray();
ただし、現在、int
、long
、および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
をスローします。
Guava を使用:
int[] intArray = Ints.toArray(Arrays.asList(array));
ドキュメンテーション:
Arrays.asList
(コアAPI)Ints.toArray
(グアバ)特に、新しい配列を作成して内容をループすることなくこれを実行できます。
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 を見てください。
または、一度だけ行う場合は、簡単な方法で行います。ただし、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++;
}
Dollar を使用するのは簡単です:
Integer[] array = ...;
int[] primitiveArray = $(array).toIntArray();