[java] 기본 long 배열을 Long 목록으로 변환

이것은 다소 쉬운 헤드 데스크 문제 일 수 있지만 첫 번째 시도는 놀랍게도 완전히 실패했습니다. 나는 원시적 인 long 배열을 가져 와서 목록으로 바꾸고 싶었습니다.

long[] input = someAPI.getSomeLongs();
List<Long> inputAsList = Arrays.asList(input); //Total failure to even compile!

이것을하는 올바른 방법은 무엇입니까?



답변

아파치 커먼즈 lang ArrayUtils ( JavaDoc , Maven 의존성 )를 사용하는 것이 편리하다는 것을 알았습니다.

import org.apache.commons.lang3.ArrayUtils;
...
long[] input = someAPI.getSomeLongs();
Long[] inputBoxed = ArrayUtils.toObject(input);
List<Long> inputAsList = Arrays.asList(inputBoxed);

또한 역 API가 있습니다

long[] backToPrimitive = ArrayUtils.toPrimitive(objectArray);

편집 : 의견 및 기타 수정 사항에서 제안한대로 목록으로 완전히 변환되도록 업데이트되었습니다.


답변

Java 8부터는 다음과 같은 스트림을 사용할 수 있습니다.

long[] arr = {1,2,3,4};
List<Long> list = Arrays.stream(arr).boxed().collect(Collectors.toList());


답변

import java.util.Arrays;
import org.apache.commons.lang.ArrayUtils;

List<Long> longs = Arrays.asList(ArrayUtils.toObject(new long[] {1,2,3,4}));


답변

hallidavejpalecek 은 배열에 대해 올바른 아이디어를 가지고 있지만 다음과 같은 기능을 활용하지 않습니다 ArrayList. 이 경우 목록의 크기가 알려져 있으므로를 만들 때 지정해야합니다 ArrayList.

List<Long> list = new ArrayList<Long>(input.length);
for (long n : input)
  list.add(n);

이런 식으로 불필요한 배열은 ArrayList너무 짧아서 버릴 수 있도록 만들어 지지 않으며 ArrayList공간 요구 사항을 과대 평가하여 빈 “슬롯”이 낭비되지 않습니다 . 물론 목록에 요소를 계속 추가하면 새로운 백업 배열이 필요합니다.


답변

조금 더 장황하지만 작동합니다.

    List<Long> list = new ArrayList<Long>();
    for (long value : input) {
        list.add(value);
    }

귀하의 예에서 Arrays.asList ()는 입력을 Long 목록 대신 long [] 배열 목록으로 해석하는 것으로 보입니다. 확실히 조금 놀랍습니다. 이 경우 오토 박싱은 원하는 방식으로 작동하지 않습니다.


답변

다른 가능성으로, 구아바 라이브러리 는이를 Longs.asList()다른 기본 유형에 대한 유사한 유틸리티 클래스와 함께 로 제공합니다 .

import com.google.common.primitives.Longs;

long[] input = someAPI.getSomeLongs();
List<Long> output = Longs.asList(input);


답변

아니요, 기본 유형의 배열에서 박스형 참조 유형의 배열로 자동 변환되지 않습니다. 당신은 할 수만 있습니다

long[] input = someAPI.getSomeLongs();
List<Long> lst = new ArrayList<Long>();

for(long l : input) lst.add(l);