이것은 다소 쉬운 헤드 데스크 문제 일 수 있지만 첫 번째 시도는 놀랍게도 완전히 실패했습니다. 나는 원시적 인 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}));
답변
hallidave 와 jpalecek 은 배열에 대해 올바른 아이디어를 가지고 있지만 다음과 같은 기능을 활용하지 않습니다 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);