Долго валялось в закладках на SO — и пригодилось, наконец. Обычно — или уже была «в коробке» Guava с Lists.partition(), или — Apache Commons и его ListUtils.partition().
Деление на подмножества (каплю доработано относительно исходника на SO):
// https://stackoverflow.com/a/30072617
public static <T> Stream<List<T>> listPartition(@NotNull List<T> source, @Positive int length) {
requireNonNull(source, "Source list must not be null");
if (length <= 0) {
throw new IllegalArgumentException("Partitions length must be greater than zero");
}
int size = source.size();
if (size == 0) {
return Stream.empty();
}
if (size <= length) {
return Stream.of(source);
}
int fullChunks = (size - 1) / length;
return IntStream.range(0, fullChunks + 1)
.mapToObj(n -> source.subList(n * length, n == fullChunks ? size : (n + 1) * length));
}
Читать далее Java List split