기본 유형 (예 : Byte, Integer, Char 등)을 가진 Java 객체의 배열이있는 경우. 기본 유형의 배열로 변환 할 수있는 깔끔한 방법이 있습니까? 특히 이것은 새 배열을 만들고 내용을 반복하지 않고도 수행 할 수 있습니다.
예를 들어
Integer[] array
이것을 변환하는 가장 좋은 방법은 무엇입니까
int[] intArray
불행히도 이것은 Hibernate와 우리가 통제 할 수없는 일부 써드 파티 라이브러리 사이에 인터페이스 할 때 우리가 꽤 자주해야하는 일입니다. 이것은 매우 일반적인 작업이 될 것 같아서 지름길이 없다면 놀랄 것입니다.
당신의 도움을 주셔서 감사합니다!
답변
불행히도 Java 플랫폼에는이를 수행하는 것이 없습니다. Btw, 또한 배열의 null
요소 를 명시 적으로 처리해야합니다 Integer[]
(이에 대해 무엇 int
을 사용할 예정입니까?).
답변
다시 한번, Apache Commons Lang 은 당신의 친구입니다. 그들은 정확히 필요한 것을 수행 하는 ArrayUtils.toPrimitive () 를 제공 합니다. 널 처리 방법을 지정할 수 있습니다.
답변
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에서는 Integer 배열을 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++;
}