[java] 객체 배열을 기본 유형의 배열로 변환

기본 유형 (예 : 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));

선적 서류 비치:


답변

특히 이것은 새 배열을 만들고 내용을 반복하지 않고도 수행 할 수 있습니다.

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++;
    }


답변

달러 사용 은 다음과 같이 간단합니다.

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