배열을 반복자로 어떻게 바꿀 수 있습니까?

참조 형식의 배열이 있는 경우 가장 쉬운 방법은 이 배열을 목록으로 만드는 것입니다. 여기에 새로운 것은 없습니다:

MyObject array = ... ;Iterator<MyObject> iterator = Arrays.asList(array).iterator();

당신은 프리미티브의 배열이있는 경우 어려움이 발생한다. int배열이 있는 경우Arrays.asList()에 전달해도List<Integer>가 발생하지 않습니다. 대신,당신은List<int>을 얻습니다.

이 경우 반복기의 문제점은 프리미티브가 아닌 참조 유형의 요소 만 반복 할 수 있다는 것입니다. 먼저 배열을 스트림에 래핑 한 다음 해당 배열에서 반복자를 가져 와서 기본 배열(적어도int,longdouble의 일반적인 트리오)에서 박스형 프리미티브의 반복자를 만들 수 있습니다:

int array = ... ;Iterator<Integer> iterator = Arrays.stream(array).iterator();

이 반복기를 일반적인 방법으로 사용할 수 있습니다. 그러나next()에 대한 모든 호출은 원시 값을 복싱하게되어 약간의 오버 헤드가 발생합니다. 당신이 반복자 스타일의 구조를 사용하지만 권투 오버 헤드를 방지하려는 경우,당신은 자바 8 에 도입 된 새로운 기본 반복자를 사용할 수 있습니다. IntStream과 같은 기본 스트림에 의해 반환되는 반복자는Iterator<Integer>과 새로운PrimitiveIterator.OfInt입니다. 이 새 반복기에는 복싱하지 않고 반복기에서int값을 반환하는 메서드nextInt()가 있습니다. 다음과 같이 사용할 수 있습니다:

PrimitiveIterator.OfInt intIterator = Arrays.stream(array).iterator();while (intIterator.hasNext()) { methodTakingInt(intIterator.nextInt());}

longdouble반복기에도 동일하게 적용되며nextLong()nextDouble()메서드가 비슷합니다.

기본 배열을 기본 스트림으로 변환하면 대부분의 사용 사례가 충족될 수 있습니다. 그러나 필요한 경우 오랜 반복자 스타일 구문을 만들 수 있는 이러한 대체 메커니즘이 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다.