Use more specific interface from the JDK.

Reported by "soundcloud.io".
diff --git a/commons-geometry-core/src/main/java/org/apache/commons/geometry/core/Transform.java b/commons-geometry-core/src/main/java/org/apache/commons/geometry/core/Transform.java
index 7eedd67..7047fab 100644
--- a/commons-geometry-core/src/main/java/org/apache/commons/geometry/core/Transform.java
+++ b/commons-geometry-core/src/main/java/org/apache/commons/geometry/core/Transform.java
@@ -16,7 +16,7 @@
  */
 package org.apache.commons.geometry.core;
 
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 /** This interface represents an <em>inversible affine transform</em> in a space.
  * Common examples of this type of transform in Euclidean space include
@@ -44,7 +44,7 @@
  * @param <P> Point implementation type
  * @see <a href="https://en.wikipedia.org/wiki/Affine_transformation">Affine Space</a>
  */
-public interface Transform<P extends Point<P>> extends Function<P, P> {
+public interface Transform<P extends Point<P>> extends UnaryOperator<P> {
 
     /** Return true if the transform preserves the orientation of the space.
      * For example, in Euclidean 2D space, this will be true for translations,
diff --git a/commons-geometry-core/src/test/java/org/apache/commons/geometry/core/partition/test/TestTransform2D.java b/commons-geometry-core/src/test/java/org/apache/commons/geometry/core/partition/test/TestTransform2D.java
index 2caa2be..0321da2 100644
--- a/commons-geometry-core/src/test/java/org/apache/commons/geometry/core/partition/test/TestTransform2D.java
+++ b/commons-geometry-core/src/test/java/org/apache/commons/geometry/core/partition/test/TestTransform2D.java
@@ -16,7 +16,7 @@
  */
 package org.apache.commons.geometry.core.partition.test;
 
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.commons.geometry.core.Transform;
 
@@ -26,7 +26,7 @@
 public class TestTransform2D implements Transform<TestPoint2D> {
 
     /** Underlying transform function. */
-    private final Function<TestPoint2D, TestPoint2D> fn;
+    private final UnaryOperator<TestPoint2D> fn;
 
     /** True if the transform preserves the handedness of the space. */
     private final boolean preservesHandedness;
@@ -34,7 +34,7 @@
     /** Create a new instance using the given transform function.
      * @param fn transform function
      */
-    public TestTransform2D(final Function<TestPoint2D, TestPoint2D> fn) {
+    public TestTransform2D(final UnaryOperator<TestPoint2D> fn) {
         this.fn = fn;
 
         final TestPoint2D tx = fn.apply(TestPoint2D.PLUS_X);
diff --git a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/oned/FunctionTransform1D.java b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/oned/FunctionTransform1D.java
index 5c0ca23..056f8cc 100644
--- a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/oned/FunctionTransform1D.java
+++ b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/oned/FunctionTransform1D.java
@@ -16,18 +16,18 @@
  */
 package org.apache.commons.geometry.euclidean.oned;
 
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
-/** Class that wraps a {@link Function} with the {@link Transform1D} interface.
+/** Class that wraps a {@link UnaryOperator} with the {@link Transform1D} interface.
  */
 public final class FunctionTransform1D implements Transform1D {
 
     /** Static instance representing the identity transform. */
     private static final FunctionTransform1D IDENTITY =
-            new FunctionTransform1D(Function.identity(), true, Vector1D.ZERO);
+            new FunctionTransform1D(UnaryOperator.identity(), true, Vector1D.ZERO);
 
     /** The underlying function for the transform. */
-    private final Function<Vector1D, Vector1D> fn;
+    private final UnaryOperator<Vector1D> fn;
 
     /** True if the transform preserves spatial orientation. */
     private final boolean preservesOrientation;
@@ -40,7 +40,7 @@
      * @param preservesOrientation true if the transform preserves spatial orientation
      * @param translation the translation component of the transform
      */
-    private FunctionTransform1D(final Function<Vector1D, Vector1D> fn, final boolean preservesOrientation,
+    private FunctionTransform1D(final UnaryOperator<Vector1D> fn, final boolean preservesOrientation,
             final Vector1D translation) {
         this.fn = fn;
         this.preservesOrientation = preservesOrientation;
@@ -84,7 +84,7 @@
      * @param fn the function to use for the transform
      * @return a new transform instance using the given function
      */
-    public static FunctionTransform1D from(final Function<Vector1D, Vector1D> fn) {
+    public static FunctionTransform1D from(final UnaryOperator<Vector1D> fn) {
         final Vector1D tOne = fn.apply(Vector1D.Unit.PLUS);
         final Vector1D tZero = fn.apply(Vector1D.ZERO);
 
diff --git a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/oned/Vector1D.java b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/oned/Vector1D.java
index d62e0a6..be0f7ab 100644
--- a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/oned/Vector1D.java
+++ b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/oned/Vector1D.java
@@ -17,7 +17,7 @@
 package org.apache.commons.geometry.euclidean.oned;
 
 import java.util.Comparator;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.commons.geometry.core.Geometry;
 import org.apache.commons.geometry.core.internal.SimpleTupleFormat;
@@ -235,7 +235,7 @@
      * @param fn the function to apply
      * @return the transformed vector
      */
-    public Vector1D transform(final Function<Vector1D, Vector1D> fn) {
+    public Vector1D transform(final UnaryOperator<Vector1D> fn) {
         return fn.apply(this);
     }
 
diff --git a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/FunctionTransform3D.java b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/FunctionTransform3D.java
index 15dca12..0bd7630 100644
--- a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/FunctionTransform3D.java
+++ b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/FunctionTransform3D.java
@@ -16,20 +16,20 @@
  */
 package org.apache.commons.geometry.euclidean.threed;
 
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.commons.geometry.euclidean.internal.Matrices;
 
-/** Class that wraps a {@link Function} with the {@link Transform3D} interface.
+/** Class that wraps a {@link UnaryOperator} with the {@link Transform3D} interface.
  */
 public final class FunctionTransform3D implements Transform3D {
 
     /** Static instance representing the identity transform. */
     private static final FunctionTransform3D IDENTITY =
-            new FunctionTransform3D(Function.identity(), true, Vector3D.ZERO);
+            new FunctionTransform3D(UnaryOperator.identity(), true, Vector3D.ZERO);
 
     /** The underlying function for the transform. */
-    private final Function<Vector3D, Vector3D> fn;
+    private final UnaryOperator<Vector3D> fn;
 
     /** True if the transform preserves spatial orientation. */
     private final boolean preservesOrientation;
@@ -42,7 +42,7 @@
      * @param preservesOrientation true if the transform preserves spatial orientation
      * @param translation the translation component of the transform
      */
-    private FunctionTransform3D(final Function<Vector3D, Vector3D> fn, final boolean preservesOrientation,
+    private FunctionTransform3D(final UnaryOperator<Vector3D> fn, final boolean preservesOrientation,
             final Vector3D translation) {
         this.fn = fn;
         this.preservesOrientation = preservesOrientation;
@@ -88,7 +88,7 @@
      * @param fn the function to use for the transform
      * @return a new transform instance using the given function
      */
-    public static FunctionTransform3D from(final Function<Vector3D, Vector3D> fn) {
+    public static FunctionTransform3D from(final UnaryOperator<Vector3D> fn) {
         final Vector3D tPlusX = fn.apply(Vector3D.Unit.PLUS_X);
         final Vector3D tPlusY = fn.apply(Vector3D.Unit.PLUS_Y);
         final Vector3D tPlusZ = fn.apply(Vector3D.Unit.PLUS_Z);
diff --git a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/Vector3D.java b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/Vector3D.java
index da6f7a6..6678b04 100644
--- a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/Vector3D.java
+++ b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/Vector3D.java
@@ -17,7 +17,7 @@
 package org.apache.commons.geometry.euclidean.threed;
 
 import java.util.Comparator;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.commons.geometry.core.internal.DoubleFunction3N;
 import org.apache.commons.geometry.core.internal.SimpleTupleFormat;
@@ -377,7 +377,7 @@
      * @param fn the function to apply
      * @return the transformed vector
      */
-    public Vector3D transform(final Function<Vector3D, Vector3D> fn) {
+    public Vector3D transform(final UnaryOperator<Vector3D> fn) {
         return fn.apply(this);
     }
 
diff --git a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/FunctionTransform2D.java b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/FunctionTransform2D.java
index 7062f1c..15fc7bb 100644
--- a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/FunctionTransform2D.java
+++ b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/FunctionTransform2D.java
@@ -16,20 +16,20 @@
  */
 package org.apache.commons.geometry.euclidean.twod;
 
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.commons.geometry.euclidean.internal.Matrices;
 
-/** Class that wraps a {@link Function} with the {@link Transform2D} interface.
+/** Class that wraps a {@link UnaryOperator} with the {@link Transform2D} interface.
  */
 public final class FunctionTransform2D implements Transform2D {
 
     /** Static instance representing the identity transform. */
     private static final FunctionTransform2D IDENTITY =
-            new FunctionTransform2D(Function.identity(), true, Vector2D.ZERO);
+            new FunctionTransform2D(UnaryOperator.identity(), true, Vector2D.ZERO);
 
     /** The underlying function for the transform. */
-    private final Function<Vector2D, Vector2D> fn;
+    private final UnaryOperator<Vector2D> fn;
 
     /** True if the transform preserves spatial orientation. */
     private final boolean preservesOrientation;
@@ -42,7 +42,7 @@
      * @param preservesOrientation true if the transform preserves spatial orientation
      * @param translation the translation component of the transform
      */
-    private FunctionTransform2D(final Function<Vector2D, Vector2D> fn, final boolean preservesOrientation,
+    private FunctionTransform2D(final UnaryOperator<Vector2D> fn, final boolean preservesOrientation,
             final Vector2D translation) {
         this.fn = fn;
         this.preservesOrientation = preservesOrientation;
@@ -87,7 +87,7 @@
      * @param fn the function to use for the transform
      * @return a new transform instance using the given function
      */
-    public static FunctionTransform2D from(final Function<Vector2D, Vector2D> fn) {
+    public static FunctionTransform2D from(final UnaryOperator<Vector2D> fn) {
         final Vector2D tPlusX = fn.apply(Vector2D.Unit.PLUS_X);
         final Vector2D tPlusY = fn.apply(Vector2D.Unit.PLUS_Y);
         final Vector2D tZero = fn.apply(Vector2D.ZERO);
diff --git a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/Vector2D.java b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/Vector2D.java
index 6e60fcf..868148d 100644
--- a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/Vector2D.java
+++ b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/Vector2D.java
@@ -17,7 +17,7 @@
 package org.apache.commons.geometry.euclidean.twod;
 
 import java.util.Comparator;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.commons.geometry.core.internal.DoubleFunction2N;
 import org.apache.commons.geometry.core.internal.SimpleTupleFormat;
@@ -321,7 +321,7 @@
      * @param fn the function to apply
      * @return the transformed vector
      */
-    public Vector2D transform(final Function<Vector2D, Vector2D> fn) {
+    public Vector2D transform(final UnaryOperator<Vector2D> fn) {
         return fn.apply(this);
     }
 
diff --git a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/oned/FunctionTransform1DTest.java b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/oned/FunctionTransform1DTest.java
index af6b378..779b23a 100644
--- a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/oned/FunctionTransform1DTest.java
+++ b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/oned/FunctionTransform1DTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.commons.geometry.euclidean.oned;
 
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.commons.geometry.euclidean.EuclideanTestUtils;
 import org.junit.Assert;
@@ -52,7 +52,7 @@
         Vector1D p2 = Vector1D.of(-1);
 
         // act
-        Transform1D t = FunctionTransform1D.from(Function.identity());
+        Transform1D t = FunctionTransform1D.from(UnaryOperator.identity());
 
         // assert
         Assert.assertTrue(t.preservesOrientation());
diff --git a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/FunctionTransform3DTest.java b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/FunctionTransform3DTest.java
index cc32706..da1e25e 100644
--- a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/FunctionTransform3DTest.java
+++ b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/FunctionTransform3DTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.commons.geometry.euclidean.threed;
 
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.commons.geometry.euclidean.EuclideanTestUtils;
 import org.junit.Assert;
@@ -52,7 +52,7 @@
         Vector3D p2 = Vector3D.of(-1, -1, -1);
 
         // act
-        FunctionTransform3D t = FunctionTransform3D.from(Function.identity());
+        FunctionTransform3D t = FunctionTransform3D.from(UnaryOperator.identity());
 
         // assert
         Assert.assertTrue(t.preservesOrientation());
diff --git a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/FunctionTransform2DTest.java b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/FunctionTransform2DTest.java
index 845b187..17cfd90 100644
--- a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/FunctionTransform2DTest.java
+++ b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/FunctionTransform2DTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.commons.geometry.euclidean.twod;
 
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.commons.geometry.euclidean.EuclideanTestUtils;
 import org.junit.Assert;
@@ -52,7 +52,7 @@
         Vector2D p2 = Vector2D.of(-1, -1);
 
         // act
-        FunctionTransform2D t = FunctionTransform2D.from(Function.identity());
+        FunctionTransform2D t = FunctionTransform2D.from(UnaryOperator.identity());
 
         // assert
         Assert.assertTrue(t.preservesOrientation());