Est-il possible de partitionner une liste en Jdk8 pur en morceaux égaux (sous-listes).
Je sais qu’il est possible d’utiliser Guava Lists class, mais pouvons-nous le faire avec du Jdk pur? Je ne veux pas ajouter de nouveaux bocaux à mon projet, juste pour un cas d'utilisation.
SOLUTONS:
La meilleure solution jusqu'à présent a été présentée par tagir-valeev :
J'ai également trouvé trois autres possibilités , mais elles ne sont mentionnées que dans quelques cas:
1.Collectors.partitioningBy () pour diviser la liste en 2 sous-listes - comme suit:
intList.stream().collect(Collectors.partitioningBy(s -> s > 6));
List<List<Integer>> subSets = new ArrayList<List<Integer>>(groups.values());
2.Collectors.groupingBy () pour diviser notre liste en plusieurs partitions:
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.Split par séparateur:
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());
Cela peut être fait facilement en utilisant la méthode subList()
:
List<String> collection = new ArrayList(21);
// fill collection
int chunkSize = 10;
List<List<String>> lists = new ArrayList<>();
for (int i=0; i<collection.size(); i+= chunkSize) {
int end = Math.min(collection.size(), i + chunkSize);
lists.add(collection.subList(i, end));
}
Essayez d'utiliser ce code, il utilise Java 8:
public static Collection<List<Integer>> splitListBySize(List<Integer> intList, int size) {
if (!intList.isEmpty() && size > 0) {
final AtomicInteger counter = new AtomicInteger(0);
return intList.stream().collect(Collectors.groupingBy(it -> counter.getAndIncrement() / size)).values();
}
return null;
}