본문 바로가기

IT

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

반응형

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개씩 잘 나눠져 있습니다.

반응형