IT

자바8 버전에서 컬렉션 파티셔닝, 적당히 작은 사이즈로 나누기

Dante2k™ 2023. 4. 12. 10:57
반응형

JAVA8 collection partition by size

 

여타 패키지에 포함되어 있는 CollectionUtils, Lists 같은 유틸리티 메소드의 힘을 빌려도 됩니다.

여기서는 JAVA8 버전에 포함된 stream 과 AtomicInteger 를 활용하여 파티셔닝하도록 유틸리티 메소드를 만들었습니다.

아직 낮은 버전의 JDK, JVM 을 고수?해야 하는 상황에서는 도움이 되리라 생각됩니다.

 

import java.util.Collection;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

public class CollectionUtil {

    public static <T> Collection<List<T>> partitionBy(Collection<T> collection, int size) {
        final AtomicInteger counter = new AtomicInteger(0);
        return collection.stream()
            .collect(Collectors.groupingBy(it -> counter.getAndIncrement() / size))
            .values();
    }
}

 

방법은 아주 단순합니다. 참조가 능한 외부변수 counter 를 이용해서 counter 내부의 숫자를 증가시키면서 size 로 integer 나눗셈을 하면 몫이 size 단위로 동일해지는 것을 활용하여 파티셔닝 기능을 제공합니다.

 

테스트를 보여드리겠습니다.

import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

class Scratch {
    public static void main(String[] args) {
        List<String> samples = Arrays.asList("a", "b", "c", "d", "e", "f", "g", "h", "i", "j");
        Collection<List<String>> partitions = partitionBy(samples, 3);
        partitions.forEach(System.out::println);
    }

    public static <T> Collection<List<T>> partitionBy(Collection<T> collection, int size) {
        final AtomicInteger counter = new AtomicInteger(0);
        return collection.stream()
            .collect(Collectors.groupingBy(it -> counter.getAndIncrement() / size))
            .values();
    }
}

위는 테스트 코드이고, samples 를 3개의 element 를 가지는 list 로 파티셔닝을 합니다.

결과는 아래와 같습니다.

 

원하는 바대로 3개씩 잘 나눠져 있습니다.

반응형