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

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-lang.git


The following commit(s) were added to refs/heads/master by this push:
     new dc6ff3457 Add ArrayFill.fill(T[], FailableIntFunction))
dc6ff3457 is described below

commit dc6ff345793c9c2d2d26919722c3eb79ffbab689
Author: Gary Gregory <garydgreg...@gmail.com>
AuthorDate: Mon Mar 24 15:15:50 2025 -0400

    Add ArrayFill.fill(T[], FailableIntFunction))
---
 src/changes/changes.xml                            |  1 +
 .../java/org/apache/commons/lang3/ArrayFill.java   | 29 ++++++++++++++++++++++
 .../java/org/apache/commons/lang3/ArrayUtils.java  |  6 +----
 .../org/apache/commons/lang3/ArrayFillTest.java    | 18 ++++++++++++++
 4 files changed, 49 insertions(+), 5 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 06bfd8802..e7aace5b2 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -110,6 +110,7 @@ The <action> type attribute can be add,update,fix,remove.
     <action                   type="add" dev="ggregory" due-to="Gary 
Gregory">Add SystemUtils.getJavaHomePath().</action>
     <action                   type="add" dev="ggregory" due-to="Gary 
Gregory">Add SystemUtils.getUserDirPath().</action>
     <action                   type="add" dev="ggregory" due-to="Gary 
Gregory">Add SystemUtils.getUserHomePath().</action>
+    <action                   type="add" dev="ggregory" due-to="Gary 
Gregory">Add ArrayFill.fill(T[], FailableIntFunction)).</action>
     <!-- UPDATE -->
     <action                   type="update" dev="ggregory" due-to="Gary 
Gregory, Dependabot">Bump org.apache.commons:commons-parent from 73 to 81 
#1267, #1277, #1283, #1288, #1302.</action>
     <action                   type="update" dev="ggregory" due-to="Gary 
Gregory, Dependabot">[site] Bump org.codehaus.mojo:taglist-maven-plugin from 
3.1.0 to 3.2.1 #1300.</action>
diff --git a/src/main/java/org/apache/commons/lang3/ArrayFill.java 
b/src/main/java/org/apache/commons/lang3/ArrayFill.java
index 2d2acd5a4..cf2a58b33 100644
--- a/src/main/java/org/apache/commons/lang3/ArrayFill.java
+++ b/src/main/java/org/apache/commons/lang3/ArrayFill.java
@@ -18,6 +18,9 @@
 package org.apache.commons.lang3;
 
 import java.util.Arrays;
+import java.util.function.IntFunction;
+
+import org.apache.commons.lang3.function.FailableIntFunction;
 
 /**
  * Fills and returns arrays in the fluent style.
@@ -131,6 +134,32 @@ public static short[] fill(final short[] a, final short 
val) {
         return a;
     }
 
+    /**
+     * Fills and returns the given array, using the provided generator 
supplier to compute each element. Like
+     * {@link Arrays#setAll(Object[], IntFunction)} with exception support.
+     * <p>
+     * If the generator supplier throws an exception, it is relayed to the 
caller and the array is left in an indeterminate
+     * state.
+     * </p>
+     *
+     * @param <T> type of elements of the array.
+     * @param array array to be initialized.
+     * @param generator a function accepting an index and producing the 
desired value for that position.
+     * @return the input array
+     * @param <E> The kind of thrown exception or error.
+     * @throws E Thrown by the given {@code generator}.
+     * @see Arrays#setAll(Object[], IntFunction)
+     * @since 3.18.0
+     */
+    public static <T, E extends Throwable> T[] fill(final T[] array, final 
FailableIntFunction<? extends T, E> generator) throws E {
+        if (array != null && generator != null) {
+            for (int i = 0; i < array.length; i++) {
+                array[i] = generator.apply(i);
+            }
+        }
+        return array;
+    }
+
     /**
      * Fills and returns the given array, assigning the given {@code T} value 
to each element of the array.
      *
diff --git a/src/main/java/org/apache/commons/lang3/ArrayUtils.java 
b/src/main/java/org/apache/commons/lang3/ArrayUtils.java
index 3e1374ad6..f26ed4f2f 100644
--- a/src/main/java/org/apache/commons/lang3/ArrayUtils.java
+++ b/src/main/java/org/apache/commons/lang3/ArrayUtils.java
@@ -4290,11 +4290,7 @@ public static int lastIndexOf(final short[] array, final 
short valueToFind, int
      */
     private static <T, R, E extends Throwable> R[] map(final T[] array, final 
Class<R> componentType, final FailableFunction<? super T, ? extends R, E> 
mapper)
             throws E {
-        final R[] newArray = newInstance(componentType, array.length);
-        for (int i = 0; i < newArray.length; i++) {
-            newArray[i] = mapper.apply(array[i]);
-        }
-        return newArray;
+        return ArrayFill.fill(newInstance(componentType, array.length), i -> 
mapper.apply(array[i]));
     }
 
     private static int max0(final int other) {
diff --git a/src/test/java/org/apache/commons/lang3/ArrayFillTest.java 
b/src/test/java/org/apache/commons/lang3/ArrayFillTest.java
index 46f1fe77d..c1deb4384 100644
--- a/src/test/java/org/apache/commons/lang3/ArrayFillTest.java
+++ b/src/test/java/org/apache/commons/lang3/ArrayFillTest.java
@@ -17,9 +17,12 @@
 
 package org.apache.commons.lang3;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertSame;
 
+import org.apache.commons.lang3.function.FailableIntFunction;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -178,4 +181,19 @@ public void testFillShortArrayNull() {
         final short[] actual = ArrayFill.fill(array, val);
         assertSame(array, actual);
     }
+
+    @Test
+    public void testFillFunction() throws Exception {
+        final FailableIntFunction<?, Exception> nullIntFunction = null;
+        assertNull(ArrayFill.fill(null, nullIntFunction));
+        assertArrayEquals(null, ArrayFill.fill(null, nullIntFunction));
+        assertArrayEquals(ArrayUtils.EMPTY_BOOLEAN_OBJECT_ARRAY, 
ArrayFill.fill(ArrayUtils.EMPTY_BOOLEAN_OBJECT_ARRAY, nullIntFunction));
+        assertArrayEquals(ArrayUtils.EMPTY_OBJECT_ARRAY, 
ArrayFill.fill(ArrayUtils.EMPTY_OBJECT_ARRAY, nullIntFunction));
+        final Integer[] array = new Integer[10];
+        final Integer[] array2 = ArrayFill.fill(array, Integer::valueOf);
+        assertSame(array, array2);
+        for (int i = 0; i < array.length; i++) {
+            assertEquals(i, array[i].intValue());
+        }
+    }
 }

Reply via email to