Post

Java Iterator 크기

1. Iterable 및 Iterator

Iterable은 Java 컬렉션 클래스의 주요 인터페이스 중 하나이다.

Collection 인터페이스는 Iterable을 확장하므로 Collection의 모든 자식 클래스도 Iterable을 구현 한다.

Iterable에는 Iterator를 생성하는 단 하나의 메서드가 있다.

1
2
3
public interface Iterable<T> {
    public Iterator<T> iterator();
}

이 Iterator를 사용하여 Iterable의 요소를 반복할 수 있다.

2. Core Java를 사용한 반복 가능한 크기

1) for-each Loop

Iterable을 구현하는 모든 클래스는 Java의 for-each 루프에 적합하다.

이를 통해 크기를 얻기 위해 카운터를 증가시키면서 Iterable의 요소를 반복할 수 있다.

1
2
3
4
5
int counter = 0;
for (Object i : data) {
    counter++;
}
return counter;

2) Collection.size()

대부분의 경우 Iterable은 List 또는 Set과 같은 Collection의 인스턴스이다.

이 경우 Iterable의 유형을 확인 하고 size() 메서드를 호출하여 요소 수를 얻을 수 있다.

1
2
3
if (data instanceof Collection) {
    return ((Collection<?>) data).size();
}

size()에 대한 호출은 일반적으로 전체 컬렉션을 반복하는 것보다 훨씬 빠르다.

다음은 위의 두 솔루션 조합을 보여주는 예이다.

1
2
3
4
5
6
7
8
9
10
11
public static int size(Iterable data) {

    if (data instanceof Collection) {
        return ((Collection<?>) data).size();
    }
    int counter = 0;
    for (Object i : data) {
        counter++;
    }
    return counter;
}

3) Stream.count()

Java 8을 사용하는 경우 Iterable에서 스트림을 만들 수 있다.

그런 다음 스트림 개체를 사용하여 Iterable의 요소 수를 가져올 수 있다.

1
return StreamSupport.stream(data.spliterator(), false).count();

3. 타사 라이브러리를 사용한 반복 가능한 크기

1) IterableUtils.size()

Apache Commons Collections 라이브러리에는 Iterable 인스턴스에 대한 정적 유틸리티 메서드를 제공하는 IterableUtils 클래스가 있다.

Maven Central에서 최신 종속 항목을 가져와야 한다.

1
2
3
4
5
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.1</version>
</dependency>

크기를 얻기 위해 Iterable 객체에서 IterableUtils의 size() 메서드를 호출할 수 있다.

1
return IterableUtils.size(data);

2) Iterables.size()

마찬가지로 Google Guava 라이브러리는 Iterable 인스턴스에서 작동하도록 Iterables 클래스에 정적 유틸리티 메서드 모음을 제공한다.

Maven Central에서 최신 종속 항목을 가져와야 한다.

1
2
3
4
5
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

Iterables 클래스에서 정적 size() 메서드를 호출하면 요소 수가 제공된다.

1
return Iterables.size(data);

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.