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