Можно ли разбить список в чистом Jdk8 на равные куски (подсписки).
Я знаю, что это возможно с помощью класса Guava Lists, но можем ли мы сделать это с чистым Jdk? Я не хочу добавлять новые фляги в свой проект, только для одного варианта использования.
СОЛЮТОНЫ:
Лучшее решение до сих пор представлял Тагир-Валеев:
Я также нашел три другие возможности, но они предназначены только для нескольких случаев:
1.Collectors.partitioningBy() разделить список на 2 подсписка - следующим образом:
intList.stream().collect(Collectors.partitioningBy(s -> s > 6));
List<List<Integer>> subSets = new ArrayList<List<Integer>>(groups.values());
2.Collectors.groupingBy(), чтобы разделить наш список на несколько разделов:
Map<Integer, List<Integer>> groups =
intList.stream().collect(Collectors.groupingBy(s -> (s - 1) / 3));
List<List<Integer>> subSets = new ArrayList<List<Integer>>(groups.values());
3. Разделить на разделитель:
List<Integer> intList = Lists.newArrayList(1, 2, 3, 0, 4, 5, 6, 0, 7, 8);
int[] indexes =
Stream.of(IntStream.of(-1), IntStream.range(0, intList.size())
.filter(i -> intList.get(i) == 0), IntStream.of(intList.size()))
.flatMapToInt(s -> s).toArray();
List<List<Integer>> subSets =
IntStream.range(0, indexes.length - 1)
.mapToObj(i -> intList.subList(indexes[i] + 1, indexes[i + 1]))
.collect(Collectors.toList());
4. Использование потоков + счетчик источника:
final List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7);
final int chunkSize = 3;
final AtomicInteger counter = new AtomicInteger();
final Collection<List<Integer>> result = numbers.stream()
.collect(Collectors.groupingBy(it -> counter.getAndIncrement() / chunkSize))
.values();