This is an automated email from the ASF dual-hosted git repository. daim pushed a commit to branch OAK-11208 in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git
commit b05a7f8d2bfcfc5f256f1682cddc4c5aebf1f4f0 Author: Rishabh Kumar <d...@adobe.com> AuthorDate: Thu Oct 17 13:15:37 2024 +0530 OAK-11208 : added util to partition list based on given partition size --- .../oak/commons/collections/CollectionUtils.java | 19 +++++++++++++++++++ .../oak/commons/collections/CollectionUtilsTest.java | 18 ++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/collections/CollectionUtils.java b/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/collections/CollectionUtils.java index 2e870bc545..f65d9e415d 100644 --- a/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/collections/CollectionUtils.java +++ b/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/collections/CollectionUtils.java @@ -30,6 +30,8 @@ import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.TreeSet; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import java.util.stream.Stream; import java.util.stream.StreamSupport; @@ -91,6 +93,23 @@ public class CollectionUtils { return result; } + /** + * Split a list into partitions of a given size. + * + * @param list the list to partition + * @param n the size of partitions + * @return a list of partitions. The resulting partitions aren’t a view of the main List, so any changes happening to the main List won’t affect the partitions. + * @param <T> the type of the elements + */ + @NotNull + public static <T> List<List<T>> partitionList(final List<T> list, final int n) { + Objects.requireNonNull(list); + return IntStream.range(0, list.size()) + .filter(i -> i % n == 0) + .mapToObj(i -> list.subList(i, Math.min(i + n, list.size()))) + .collect(Collectors.toList()); + } + /** * Convert an iterable to a set. The returning set is mutable and supports all optional operations. * @param iterable the iterable to convert diff --git a/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/collections/CollectionUtilsTest.java b/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/collections/CollectionUtilsTest.java index ae2f7065fc..74538b2232 100644 --- a/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/collections/CollectionUtilsTest.java +++ b/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/collections/CollectionUtilsTest.java @@ -64,6 +64,24 @@ public class CollectionUtilsTest { Assert.assertEquals(data, CollectionUtils.toList(iterable.iterator())); } + @Test + public void partitionList() { + final List<String> list = List.of("a", "b", "c", "d", "e", "f", "g"); + final List<List<String>> partitions = CollectionUtils.partitionList(list, 3); + Assert.assertEquals(3, partitions.size()); + Assert.assertEquals(List.of("a", "b", "c"), partitions.get(0)); + Assert.assertEquals(List.of("d", "e", "f"), partitions.get(1)); + Assert.assertEquals(List.of("g"), partitions.get(2)); + } + + @Test + public void partitionListWhenListIsSmallerThanPartitionSize() { + final List<String> list = List.of("a"); + final List<List<String>> partitions = CollectionUtils.partitionList(list, 3); + Assert.assertEquals(1, partitions.size()); + Assert.assertEquals(List.of("a"), partitions.get(0)); + } + @Test public void iterableToSet() { // create an iterable