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

Reply via email to