重複の可能性:
オブジェクトの配列をプリミティブ型の配列に変換する
私Parcel
はAndroid用に作成していて、ArrayList<Long>
(toArrayが私に与えるLong[]
)をに変換してパッケージ化しようとしていますlong[]
が、これを行う簡単な方法はありますか?
ループできることはわかっていますが、もっとエレガントなソリューションを探していると思います。
重複の可能性:
オブジェクトの配列をプリミティブ型の配列に変換する
私Parcel
はAndroid用に作成していて、ArrayList<Long>
(toArrayが私に与えるLong[]
)をに変換してパッケージ化しようとしていますlong[]
が、これを行う簡単な方法はありますか?
ループできることはわかっていますが、もっとエレガントなソリューションを探していると思います。
ApachecommonsArrayUtilsを使用できます。
long[] longArray = ArrayUtils.toPrimitive(longObjectArray);
またはGoogleのグアバで:
long[] longArray = Longs.toArray(Arrays.asList(longObjectArray));
残念ながら、ループするより簡単な方法はありません。この投稿は反対のことをすることについてですが、考え方は同じです...
別の回答ではApacheCommonsが推奨されており、Androidを使用しているため、追加の依存関係を含める場合は、guavaLongsユーティリティクラスを使用します。
long[] primitive = Longs.toArray(listOfLongObjects);
参考までに、コードは次のとおりです。
public static long[] toArray(Collection<? extends Number> collection) {
if (collection instanceof LongArrayAsList) {
return ((LongArrayAsList) collection).toLongArray();
}
Object[] boxedArray = collection.toArray();
int len = boxedArray.length;
long[] array = new long[len];
for (int i = 0; i < len; i++) {
// checkNotNull for GWT (do not optimize)
array[i] = ((Number) checkNotNull(boxedArray[i])).longValue();
}
return array;
}
Long
とlong
は異なるタイプです。Long
クラスです。long
プリミティブです。Long
Java 5に導入されたオートボクシングは、との間の双方向変換がlong
コンパイラによって自動的に行われるため、一部の人々を混乱させる可能性があります。ただし、これはアレイには正しくありません。これは、タイプの新しい配列を作成しlong
、要素ごとにコピーする必要があることを意味します。
List<Long> list = new ArrayList<>();
// this way you create array of Long
Long[] arr1 = list.toArray(new Long[list.size()]);
// this way you create array of long
long[] arr2 = new long[list.size()];
int i = 0;
for (Long e : list) {
arr2[i++] = e; // autoboxing does the job here
}
System.arrcopy()
もちろん、自分でループを書く代わりに使用することができます。ただし、idは何の違いもありません。