Java에서 List 를 int[] 로 변환하려면 어떻게 해야 합니까?
자바에 처음 와봐요.「 」를 해야 ?List<Integer>
로로 합니다.int[]
★★★★★★★★★★★★★★★★★?
헷갈리네요.List.toArray()
는 실제로 「」를 합니다.Object[]
할 수 Integer[]
않다int[]
.
지금은 루프를 사용하여 그렇게 하고 있습니다.
int[] toIntArray(List<Integer> list) {
int[] ret = new int[list.size()];
for(int i = 0; i < ret.length; i++)
ret[i] = list.get(i);
return ret;
}
더 좋은 방법이 있을까요?
이것은 Java에서 int[]를 Integer[]로 변환하는 방법과 비슷합니다.
Java 8에는 아직 스트림이 추가되지 않았습니다.다음은 예를 제시하겠습니다.
int[] example1 = list.stream().mapToInt(i->i).toArray();
// OR
int[] example2 = list.stream().mapToInt(Integer::intValue).toArray();
사고 과정:
한 ★★★★★
Stream#toArray
Object[]
이치노ㅇㅇㅇㅇ.Stream#toArray(IntFunction<A[]> generator)
이 안 맞아서 싶은 안 돼요. 왜냐하면 범용 타입은A
을 수int
수 것 요.
int
Integer
이유는 '그것'이기 때문입니다toArray
될 수 .int[]
어레이 등)Object[]
상자에 넣어두기도 한다.Integer[]
여기서 부자연스러울 거야)그리고 다행히도 Java 8에는 이러한 스트림이 있습니다.그래서 이제 할 해야 하는가 이다.
Stream<Integer>
(은 (에서)list.stream()
반짝반짝 빛나다IntStream
여기 구조 방법이 있습니다.우리가 해야 할 일은 그 지도만 건네주면 돼Integer
로로 합니다.int
.이런 걸 쓰면...
int
다음과 같이 합니다.mapToInt( (Integer i) -> i.intValue() )
어떤 은 다음을 선호할 수 .
mapToInt(Integer::intValue)
이 람다의 을 사용하여 될 수 은 컴파일러가 이 의 결과가 unboxing의 있기 때문입니다.
int
mapToInt
의 실장입니다.ToIntFunction
과 같은 :int applyAsInt(T value)
는 ", ", "를 해야 합니다.int
를 참조해 주세요.간단하게 다음과 같이 쓸 수 있습니다.
mapToInt((Integer i)->i)
「 」이래, 「 」이래, 「 」이래,
Integer
를 치다(Integer i)
할 수 .List<Integer>#stream()
를 반환하다Stream<Integer>
도 있고, 그냥 넘어갈 수도 있어요.mapToInt(i -> i)
유감스럽게도 자바가 원시 타입, 박스, 어레이 및 제네릭을 처리하는 특성 때문에 더 나은 방법은 없다고 생각합니다.특히:
List<T>.toArray
안 안 된다Integer
로로 합니다.int
- 하면 안 요.
int
제네릭스를 위한 형식적인 논쟁으로서, 그래서 그것은 하나의 논리여야 할 것이다.int
- 방식 속임수를 한 방식 「 」( 「 」 또또 ) ) 。
모든 원시 유형에 대해 이러한 종류의 메서드를 자동으로 생성하는 라이브러리가 있다고 생각합니다(즉, 유형별로 복사되는 템플릿이 있습니다).못생겼지만, 유감스럽게도 그런 것 같습니다.
클래스는 제네릭이 Java에 도착하기 전에 나왔지만, 오늘날 도입된다면(원시 어레이를 사용하고 싶다고 가정할 때) 여전히 모든 끔찍한 오버로드를 포함해야 합니다.
Commons Lang 이외에도 Guava의 메서드로 이를 수행할 수 있습니다.
List<Integer> list = ...
int[] ints = Ints.toArray(list);
이것에 의해, Commons Lang에 상당하는 어레이의 중간 변환을 스스로 실시할 필요가 없어집니다.
가장 쉬운 방법은 Apache Commons Lang을 사용하는 것입니다.원하는 작업을 수행할 수 있는 편리한 Array Utils 클래스가 있습니다.다음 배열에 대해 오버로드와 함께 메서드를 사용합니다.Integer
s.
List<Integer> myList;
... assign and fill the list
int[] intArray = ArrayUtils.toPrimitive(myList.toArray(new Integer[myList.size()]));
이렇게 하면 바퀴를 재창조할 수 없습니다.Commons Lang은 Java가 빠뜨린 유용한 것들을 많이 가지고 있다.위에서 적절한 크기의 Integer 목록을 작성했습니다.또한 0 길이의 정적 정수 배열을 사용하여 Java가 적절한 크기의 배열을 할당할 수도 있습니다.
static final Integer[] NO_INTS = new Integer[0];
....
int[] intArray2 = ArrayUtils.toPrimitive(myList.toArray(NO_INTS));
Java 8은 스트림을 통해 이를 쉽게 수행할 수 있는 방법을 제공합니다.
stream()
ints(IntStream) IntStream(Ints) ★IntStream
하면 Array()를 얻을 수 .int []
int [] ints = list.stream().mapToInt(Integer::intValue).toArray();
int[] toIntArray(List<Integer> list) {
int[] ret = new int[list.size()];
int i = 0;
for (Integer e : list)
ret[i++] = e;
return ret;
}
값비싼 목록 인덱싱을 피하기 위해 코드를 약간 변경합니다(목록은 반드시 ArrayList는 아니지만 링크된 목록일 수 있으므로 랜덤 액세스 비용이 많이 듭니다).
이것은 Java 8의 한 줄 코드입니다.
public int[] toIntArray(List<Integer> intList){
return intList.stream().mapToInt(Integer::intValue).toArray();
}
" " " 를 Integer
int
매핑 로직은 범위 밖의 변수에 의존하지 않으므로 병렬 처리를 고려해야 합니다.
int[] arr = list.parallelStream().mapToInt(Integer::intValue).toArray();
이것만 알아두세요.
병렬 처리가 시리얼 조작보다 자동적으로 고속인 것은 아닙니다.다만, 데이터와 프로세서 코어가 충분한 경우는, 병렬 처리가 자동적으로 고속인 것은 아닙니다.Aggregate Operations를 사용하면 병렬 처리를 보다 쉽게 구현할 수 있지만, 애플리케이션이 병렬 처리에 적합한지 판단하는 것은 여전히 사용자의 책임입니다.
정수를 원시 형태로 매핑하는 방법에는 두 가지가 있습니다.
경유
ToIntFunction
.mapToInt(Integer::intValue)
람다 표현과 함께 명시적인 언박스를 통해.
mapToInt(i -> i.intValue())
람다 식을 사용한 암시적(자동) 언박스를 통해.
mapToInt(i -> i)
리스트와 함께null
가치
List<Integer> list = Arrays.asList(1, 2, null, 4, 5);
다음 세 가지 옵션을 사용할 수 있습니다.null
:
.
null
값을 지정합니다.int[] arr = list.parallelStream().filter(Objects::nonNull).mapToInt(Integer::intValue).toArray();
를 매핑합니다.
null
기본값으로 설정합니다.int[] arr = list.parallelStream().map(i -> i == null ? -1 : i).mapToInt(Integer::intValue).toArray();
★★
null
을 사용하다int[] arr = list.parallelStream().mapToInt(i -> i == null ? -1 : i.intValue()).toArray();
이 간단한 루프는 항상 정확합니다! 버그 없음
int[] integers = new int[myList.size()];
for (int i = 0; i < integers.length; i++) {
integers[i] = myList.get(i);
}
여기 하나 더 넣을게요.루프를 위한 용도는 몇 가지 있지만 루프 내부에는 아무것도 필요하지 않습니다.내가 이것을 언급하는 이유는 단지 원래의 질문이 덜 상세한 코드를 찾으려는 것이었기 때문이다.
int[] toArray(List<Integer> list) {
int[] ret = new int[ list.size() ];
int i = 0;
for( Iterator<Integer> it = list.iterator();
it.hasNext();
ret[i++] = it.next() );
return ret;
}
Java가 C++와 같이 for 루프에서 여러 선언을 허용했다면, 한 걸음 더 나아가서 (int i = 0, 반복자)에 대해 수행할 수 있습니다.
다만(이 부분은 제 의견일 뿐) 결국, 당신을 위해 무언가를 할 수 있는 도움의 기능이나 방법을 가지고 있다면, 그것을 설정하고 잊어버리세요.그것은 한 줄짜리일 수도 있고 열 줄짜리일 수도 있다; 만약 당신이 그것을 다시 보지 않는다면 당신은 차이를 모를 것이다.
toArray는 오브젝트[]를 반환하고 오브젝트[]에서int[] 또는 Integer[]에서int[]로 캐스트 할 수 없기 때문에, 실제로 실행하려고 하는 작업을 「한 줄」으로 하는 방법은 없습니다.
int[] ret = new int[list.size()];
Iterator<Integer> iter = list.iterator();
for (int i=0; iter.hasNext(); i++) {
ret[i] = iter.next();
}
return ret;
import static com.humaorie.dollar.Dollar.*
...
List<Integer> source = ...;
int[] ints = $(source).convert().toIntArray();
도 꼭 하시길 권해드립니다.List<?>
Java collections API 입니다.
package mypackage;
import java.util.AbstractList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Test {
//Helper method to convert int arrays into Lists
static List<Integer> intArrayAsList(final int[] a) {
if(a == null)
throw new NullPointerException();
return new AbstractList<Integer>() {
@Override
public Integer get(int i) {
return a[i];//autoboxing
}
@Override
public Integer set(int i, Integer val) {
final int old = a[i];
a[i] = val;//auto-unboxing
return old;//autoboxing
}
@Override
public int size() {
return a.length;
}
};
}
public static void main(final String[] args) {
int[] a = {1, 2, 3, 4, 5};
Collections.reverse(intArrayAsList(a));
System.out.println(Arrays.toString(a));
}
}
박스/언박스의 결점에 주의
Eclipse 컬렉션을 사용하여 유형 목록이 있는 경우 다음을 수행할 수 있습니다.java.util.List<Integer>
:
List<Integer> integers = Lists.mutable.with(1, 2, 3, 4, 5);
int[] ints = LazyIterate.adapt(integers).collectInt(i -> i).toArray();
Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 5}, ints);
와 같은 Eclipse 컬렉션 유형이 이미 있는 경우 다음을 수행할 수 있습니다.
MutableList<Integer> integers = Lists.mutable.with(1, 2, 3, 4, 5);
int[] ints = integers.asLazy().collectInt(i -> i).toArray();
Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 5}, ints);
주의: 저는 Eclipse Collections의 커밋입니다.
lamda를 사용하면 다음과 같은 작업을 수행할 수 있습니다(jdk lamda의 컴파일).
public static void main(String ars[]) {
TransformService transformService = (inputs) -> {
int[] ints = new int[inputs.size()];
int i = 0;
for (Integer element : inputs) {
ints[ i++ ] = element;
}
return ints;
};
List<Integer> inputs = new ArrayList<Integer>(5) { {add(10); add(10);} };
int[] results = transformService.transform(inputs);
}
public interface TransformService {
int[] transform(List<Integer> inputs);
}
언급URL : https://stackoverflow.com/questions/960431/how-can-i-convert-listinteger-to-int-in-java
'programing' 카테고리의 다른 글
epoll의 에지 트리거링 옵션의 용도는 무엇입니까? (0) | 2022.07.07 |
---|---|
계산된 vue에서 화살표 사용 기능이 작동하지 않음 (0) | 2022.07.07 |
왜 기억에 쓰는 것이 읽는 것보다 훨씬 느릴까요? (0) | 2022.07.07 |
C/C++ 메인 함수의 파라미터는 어디에 있습니까? (0) | 2022.07.07 |
Vue 인스턴스의 $on 메서드가 작동하지 않습니다. (0) | 2022.07.07 |