diff --git a/src/main/java/org/codehaus/groovy/runtime/ArrayGroovyMethods.java b/src/main/java/org/codehaus/groovy/runtime/ArrayGroovyMethods.java
index 5f00f32..d7808ab 100644
--- a/src/main/java/org/codehaus/groovy/runtime/ArrayGroovyMethods.java
+++ b/src/main/java/org/codehaus/groovy/runtime/ArrayGroovyMethods.java
@@ -2483,7 +2483,7 @@
      *
      * @param self      an array
      * @param condition the matching condition
-     * @return an integer that is the index of the first matched object or -1 if no match was found
+     * @return The index of the first matched object or -1 if no match was found.
      * @since 2.5.0
      */
     public static <T> int findIndexOf(T[] self, @ClosureParams(FirstParam.Component.class) Closure<?> condition) {
@@ -2498,7 +2498,7 @@
      * @param self       an array
      * @param startIndex start matching from this index
      * @param condition  the matching condition
-     * @return an integer that is the index of the first matched object or -1 if no match was found
+     * @return The index of the first matched object or -1 if no match was found.
      * @since 2.5.0
      */
     public static <T> int findIndexOf(T[] self, int startIndex, @ClosureParams(FirstParam.Component.class) Closure<?> condition) {
@@ -2540,32 +2540,57 @@
     // findLastIndexOf
 
     /**
-     * Iterates over the elements of an array and returns the index of the last
-     * item that matches the condition specified in the closure.
+     * Returns the index of the last item that matches the specified condition.
+     * <pre class="groovyTestCase">
+     * def array = new Number[]{1, 2, 1, 2, 1}
+     * assert array.findLastIndexOf{it==1} ==  4
+     * assert array.findLastIndexOf{it==2} ==  3
+     * assert array.findLastIndexOf{it==3} == -1
+     * assert array.findLastIndexOf{it&gt;=0} ==  4
+     * assert array.findLastIndexOf{it&lt;=0} == -1
+     * def empty = new Object[0]
+     * assert empty.findLastIndexOf {true} == -1
+     * </pre>
      *
      * @param self      an array
      * @param condition the matching condition
-     * @return an integer that is the index of the last matched object or -1 if no match was found
+     * @return The index of the last matched object or -1 if no match was found.
      * @since 2.5.0
      */
     public static <T> int findLastIndexOf(T[] self, @ClosureParams(FirstParam.Component.class) Closure<?> condition) {
-        return DefaultGroovyMethods.findLastIndexOf(new ArrayIterator<>(self), 0, condition);
+        return findLastIndexOf(self, 0, condition);
     }
 
     /**
-     * Iterates over the elements of an array, starting from a specified index,
-     * and returns the index of the last item that matches the condition
-     * specified in the closure.
+     * Returns the index of the last item that matches the specified condition
+     * that is at or beyond the given index.
+     * <pre class="groovyTestCase">
+     * def array = new Number[]{3, 1, 2, 1, 2, 1}
+     * assert array.findLastIndexOf(1,{it==0}) == -1
+     * assert array.findLastIndexOf(1,{it==1}) ==  5
+     * assert array.findLastIndexOf(1,{it==2}) ==  4
+     * assert array.findLastIndexOf(1,{it==3}) == -1
+     * assert array.findLastIndexOf(0,{it==3}) ==  0
+     * def empty = new Object[0]
+     * assert empty.findLastIndexOf( 2,{true}) == -1
+     * assert empty.findLastIndexOf(-2,{true}) == -1
+     * </pre>
      *
      * @param self       an array
-     * @param startIndex start matching from this index
+     * @param lowerBound the minimum index
      * @param condition  the matching condition
-     * @return an integer that is the index of the last matched object or -1 if no match was found
+     * @return The index of the last matched object or -1 if no match was found.
      * @since 2.5.0
      */
-    public static <T> int findLastIndexOf(T[] self, int startIndex, @ClosureParams(FirstParam.Component.class) Closure<?> condition) {
-        // TODO: Could this be made more efficient by using a reverse index?
-        return DefaultGroovyMethods.findLastIndexOf(new ArrayIterator<>(self), startIndex, condition);
+    public static <T> int findLastIndexOf(T[] self, int lowerBound, @ClosureParams(FirstParam.Component.class) Closure<?> condition) {
+        BooleanClosureWrapper bcw = new BooleanClosureWrapper(condition);
+        if (lowerBound < 0) lowerBound = 0; // ensure it's non-negative
+        for (int i = self.length - 1; i >= lowerBound; i -= 1) {
+            if (bcw.call(self[i])) {
+                return i;
+            }
+        }
+        return -1;
     }
 
     //--------------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java b/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
index ae42b8a..3e444a1 100644
--- a/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
+++ b/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
@@ -96,7 +96,6 @@
 import org.codehaus.groovy.runtime.typehandling.NumberMath;
 import org.codehaus.groovy.tools.RootLoader;
 import org.codehaus.groovy.transform.trait.Traits;
-import org.codehaus.groovy.util.ArrayIterator;
 import org.codehaus.groovy.util.IteratorBufferedIterator;
 import org.codehaus.groovy.util.ListBufferedIterator;
 
@@ -14904,33 +14903,32 @@
 
     @Deprecated(since = "5.0.0")
     public static <T> List<Number> findIndexValues(T[] self, @ClosureParams(FirstParam.Component.class) Closure condition) {
-        return findIndexValues(self, 0, condition);
+        return ArrayGroovyMethods.findIndexValues(self, 0, condition);
     }
 
     @Deprecated(since = "5.0.0")
     public static <T> List<Number> findIndexValues(T[] self, Number startIndex, @ClosureParams(FirstParam.Component.class) Closure condition) {
-        return findIndexValues(new ArrayIterator<>(self), startIndex, condition);
+        return ArrayGroovyMethods.findIndexValues(self, startIndex, condition);
     }
 
     @Deprecated(since = "5.0.0")
     public static <T> int findIndexOf(T[] self, @ClosureParams(FirstParam.Component.class) Closure condition) {
-        return findIndexOf(self, 0, condition);
+        return ArrayGroovyMethods.findIndexOf(self, 0, condition);
     }
 
     @Deprecated(since = "5.0.0")
     public static <T> int findIndexOf(T[] self, int startIndex, @ClosureParams(FirstParam.Component.class) Closure condition) {
-        return findIndexOf(new ArrayIterator<>(self), startIndex, condition);
+        return ArrayGroovyMethods.findIndexOf(self, startIndex, condition);
     }
 
     @Deprecated(since = "5.0.0")
     public static <T> int findLastIndexOf(T[] self, @ClosureParams(FirstParam.Component.class) Closure condition) {
-        return findLastIndexOf(new ArrayIterator<>(self), 0, condition);
+        return ArrayGroovyMethods.findLastIndexOf(self, 0, condition);
     }
 
     @Deprecated(since = "5.0.0")
     public static <T> int findLastIndexOf(T[] self, int startIndex, @ClosureParams(FirstParam.Component.class) Closure condition) {
-        // TODO could be made more efficient by using a reverse index
-        return findLastIndexOf(new ArrayIterator<>(self), startIndex, condition);
+        return ArrayGroovyMethods.findLastIndexOf(self, startIndex, condition);
     }
 
     @Deprecated(since = "5.0.0")
