참조 형식의 배열이 있는 경우 가장 쉬운 방법은 이 배열을 목록으로 만드는 것입니다. 여기에 새로운 것은 없습니다:
MyObject array = ... ;Iterator<MyObject> iterator = Arrays.asList(array).iterator();
당신은 프리미티브의 배열이있는 경우 어려움이 발생한다. int
배열이 있는 경우Arrays.asList()
에 전달해도List<Integer>
가 발생하지 않습니다. 대신,당신은List<int>
을 얻습니다.
이 경우 반복기의 문제점은 프리미티브가 아닌 참조 유형의 요소 만 반복 할 수 있다는 것입니다. 먼저 배열을 스트림에 래핑 한 다음 해당 배열에서 반복자를 가져 와서 기본 배열(적어도int
,long
및double
의 일반적인 트리오)에서 박스형 프리미티브의 반복자를 만들 수 있습니다:
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());}
long
및double
반복기에도 동일하게 적용되며nextLong()
및nextDouble()
메서드가 비슷합니다.
기본 배열을 기본 스트림으로 변환하면 대부분의 사용 사례가 충족될 수 있습니다. 그러나 필요한 경우 오랜 반복자 스타일 구문을 만들 수 있는 이러한 대체 메커니즘이 있습니다.