This is an automated email from the ASF dual-hosted git repository.

daim pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git


The following commit(s) were added to refs/heads/trunk by this push:
     new f6d2039c6c OAK-11566 : added util to replace Iterables.find in 
oak-commons (#2161)
f6d2039c6c is described below

commit f6d2039c6cc1b0fa136a0b51debc25e0beb19977
Author: Rishabh Kumar <[email protected]>
AuthorDate: Mon Mar 10 18:46:43 2025 +0530

    OAK-11566 : added util to replace Iterables.find in oak-commons (#2161)
    
    Co-authored-by: Rishabh Kumar <[email protected]>
---
 .../oak/commons/collections/IterableUtils.java     | 24 +++++++--
 .../oak/commons/collections/IterableUtilsTest.java | 63 +++++++++++++++++++++-
 2 files changed, 83 insertions(+), 4 deletions(-)

diff --git 
a/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/collections/IterableUtils.java
 
b/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/collections/IterableUtils.java
index 14e0c28831..a09e096e60 100644
--- 
a/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/collections/IterableUtils.java
+++ 
b/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/collections/IterableUtils.java
@@ -18,7 +18,6 @@
  */
 package org.apache.jackrabbit.oak.commons.collections;
 
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.collections4.iterators.LazyIteratorChain;
 import org.apache.jackrabbit.oak.commons.conditions.Validate;
 import org.jetbrains.annotations.NotNull;
@@ -32,6 +31,7 @@ import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Objects;
 import java.util.function.Function;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 /**
@@ -188,7 +188,7 @@ public class IterableUtils {
      * @throws NullPointerException if the iterable or predicate is null
      */
     public static <E> boolean matchesAll(final Iterable<E> itr, final 
Predicate<? super E> predicate) {
-        return org.apache.commons.collections4.IterableUtils.matchesAll(itr, 
predicate);
+        return org.apache.commons.collections4.IterableUtils.matchesAll(itr, 
predicate::test);
     }
 
     /**
@@ -274,7 +274,7 @@ public class IterableUtils {
      * @throws NullPointerException if the iterable or predicate is null
      */
     public static <E> Iterable<E> filter(final Iterable<E> itr, final 
Predicate<? super E> predicate) {
-        return 
org.apache.commons.collections4.IterableUtils.filteredIterable(itr, predicate);
+        return 
org.apache.commons.collections4.IterableUtils.filteredIterable(itr, 
predicate::test);
     }
 
     /**
@@ -428,4 +428,22 @@ public class IterableUtils {
         Objects.requireNonNull(iterable, "Iterable must not be null.");
         return org.apache.commons.collections4.IterableUtils.get(iterable, 
index);
     }
+
+    /**
+     * Returns the first element in the specified iterable that matches the 
given predicate.
+     * <p>
+     * The iterable is traversed until an element is found that satisfies the 
predicate.
+     * If no element satisfies the predicate, {@code null} is returned.
+     *
+     * @param <T> the type of elements in the iterable
+     * @param iterable the iterable to search, must not be null
+     * @param predicate the predicate to apply, must not be null
+     * @return the first element that satisfies the predicate, or null if no 
such element exists
+     * @throws NullPointerException if either the iterable or predicate is null
+     */
+    public static <T> T find(final Iterable<T> iterable, final Predicate<? 
super T> predicate) {
+        Objects.requireNonNull(iterable, "Iterable must not be null.");
+        Objects.requireNonNull(predicate, "Predicate must not be null.");
+        return org.apache.commons.collections4.IterableUtils.find(iterable, 
predicate::test);
+    }
 }
diff --git 
a/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/collections/IterableUtilsTest.java
 
b/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/collections/IterableUtilsTest.java
index 55ad5ad59a..7984918191 100644
--- 
a/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/collections/IterableUtilsTest.java
+++ 
b/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/collections/IterableUtilsTest.java
@@ -18,7 +18,6 @@
  */
 package org.apache.jackrabbit.oak.commons.collections;
 
-import org.apache.commons.collections4.Predicate;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -31,6 +30,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.function.Function;
+import java.util.function.Predicate;
 
 /**
  * Unit tests for the {@link IterableUtils} class.
@@ -969,4 +969,65 @@ public class IterableUtilsTest {
         String result = IterableUtils.get(list, 0);
         Assert.assertEquals("only", result);
     }
+
+    @Test
+    public void testFindWithMatchingElement() {
+        List<String> list = Arrays.asList("apple", "banana", "cherry");
+        String result = IterableUtils.find(list, s -> s.startsWith("b"));
+        Assert.assertEquals("banana", result);
+    }
+
+    @Test
+    public void testFindWithNoMatchingElement() {
+        List<String> list = Arrays.asList("apple", "banana", "cherry");
+        String result = IterableUtils.find(list, s -> s.startsWith("d"));
+        Assert.assertNull(result);
+    }
+
+    @Test
+    public void testFindWithMultipleMatchingElements() {
+        List<String> list = Arrays.asList("apple", "avocado", "banana", 
"apricot");
+        String result = IterableUtils.find(list, s -> s.startsWith("a"));
+        // Should return the first matching element
+        Assert.assertEquals("apple", result);
+    }
+
+    @Test
+    public void testFindWithEmptyIterable() {
+        List<String> list = Collections.emptyList();
+        String result = IterableUtils.find(list, s -> true);
+        Assert.assertNull(result);
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testFindWithNullIterable() {
+        IterableUtils.find(null, s -> true);
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testFindWithNullPredicate() {
+        List<String> list = Arrays.asList("apple", "banana", "cherry");
+        IterableUtils.find(list, null);
+    }
+
+    @Test
+    public void testFindFirstElement() {
+        List<Integer> list = Arrays.asList(10, 20, 30, 40, 50);
+        Integer result = IterableUtils.find(list, i -> i > 5);
+        Assert.assertEquals(Integer.valueOf(10), result);
+    }
+
+    @Test
+    public void testFindLastElement() {
+        List<Integer> list = Arrays.asList(10, 20, 30, 40, 50);
+        Integer result = IterableUtils.find(list, i -> i > 45);
+        Assert.assertEquals(Integer.valueOf(50), result);
+    }
+
+    @Test
+    public void testFindWithCustomIterable() {
+        Iterable<Integer> customIterable = () -> Arrays.asList(5, 10, 15, 20, 
25).iterator();
+        Integer result = IterableUtils.find(customIterable, i -> i % 10 == 0);
+        Assert.assertEquals(Integer.valueOf(10), result);
+    }
 }

Reply via email to