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

gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven.git

commit f5a407cf79494d90ad1df4aa6336239c542d98e1
Author: Guillaume Nodet <gno...@gmail.com>
AuthorDate: Mon Jan 13 10:38:10 2025 +0100

    [MNG-8515] Use specialized methods
    
    * UnaryOperator<String> instead of Function<String, String>
    * BinaryOperator<String> instead of BiFunction<String, String, String>
---
 .../java/org/apache/maven/api/cli/Options.java     |  4 +--
 .../org/apache/maven/api/cli/mvn/MavenOptions.java |  4 +--
 .../maven/api/cli/mvnenc/EncryptOptions.java       |  4 +--
 .../apache/maven/api/cli/mvnsh/ShellOptions.java   |  4 +--
 .../apache/maven/api/services/Interpolator.java    | 29 ++++++++--------
 .../maven/api/services/SettingsBuilderRequest.java | 14 ++++----
 .../maven/cli/ExtensionConfigurationModule.java    | 12 +++----
 .../main/java/org/apache/maven/cli/MavenCli.java   | 14 ++++----
 .../internal/BootstrapCoreExtensionManager.java    | 12 +++----
 .../apache/maven/cli/props/MavenProperties.java    |  8 ++---
 .../maven/cli/props/MavenPropertiesLoader.java     | 14 ++++----
 .../extensions/BootstrapCoreExtensionManager.java  | 12 +++----
 .../extensions/ExtensionConfigurationModule.java   | 12 +++----
 .../org/apache/maven/cling/invoker/BaseParser.java |  4 +--
 .../apache/maven/cling/invoker/LookupInvoker.java  |  4 +--
 .../invoker/PlexusContainerCapsuleFactory.java     |  4 +--
 .../java/org/apache/maven/cling/invoker/Utils.java |  8 ++---
 .../cling/invoker/mvn/CommonsCliMavenOptions.java  |  7 ++--
 .../cling/invoker/mvn/LayeredMavenOptions.java     |  4 +--
 .../invoker/mvnenc/CommonsCliEncryptOptions.java   |  6 ++--
 .../invoker/mvnsh/CommonsCliShellOptions.java      |  7 ++--
 .../apache/maven/cling/props/MavenProperties.java  |  8 ++---
 .../maven/cling/props/MavenPropertiesLoader.java   | 14 ++++----
 .../impl/DefaultPluginConfigurationExpander.java   |  4 +--
 .../internal/impl/DefaultSettingsBuilder.java      |  8 ++---
 .../internal/impl/DefaultToolchainsBuilder.java    |  4 +--
 .../internal/impl/model/DefaultInterpolator.java   | 39 ++++++++++------------
 .../internal/impl/model/DefaultModelBuilder.java   |  3 +-
 .../impl/model/DefaultModelInterpolator.java       |  7 ++--
 .../impl/model/DefaultModelNormalizer.java         |  4 +--
 .../impl/model/DefaultModelPathTranslator.java     |  4 +--
 .../impl/model/profile/ConditionParser.java        |  6 ++--
 .../model/profile/ConditionProfileActivator.java   |  4 +--
 .../impl/model/DefaultInterpolatorTest.java        |  6 ++--
 .../impl/model/profile/ConditionParserTest.java    |  4 +--
 src/mdo/transformer.vm                             | 10 +++---
 36 files changed, 154 insertions(+), 158 deletions(-)

diff --git 
a/api/maven-api-cli/src/main/java/org/apache/maven/api/cli/Options.java 
b/api/maven-api-cli/src/main/java/org/apache/maven/api/cli/Options.java
index 6adc57bac4..d2bf596cd9 100644
--- a/api/maven-api-cli/src/main/java/org/apache/maven/api/cli/Options.java
+++ b/api/maven-api-cli/src/main/java/org/apache/maven/api/cli/Options.java
@@ -21,7 +21,7 @@ package org.apache.maven.api.cli;
 import java.util.Map;
 import java.util.Optional;
 import java.util.function.Consumer;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.api.annotations.Experimental;
 import org.apache.maven.api.annotations.Nonnull;
@@ -205,7 +205,7 @@ public interface Options {
      * @return a new {@link Options} instance with interpolated values
      */
     @Nonnull
-    Options interpolate(@Nonnull Function<String, String> callback);
+    Options interpolate(@Nonnull UnaryOperator<String> callback);
 
     /**
      * Emits warning messages if deprecated options are used.
diff --git 
a/api/maven-api-cli/src/main/java/org/apache/maven/api/cli/mvn/MavenOptions.java
 
b/api/maven-api-cli/src/main/java/org/apache/maven/api/cli/mvn/MavenOptions.java
index 75a932ba8a..21f241750e 100644
--- 
a/api/maven-api-cli/src/main/java/org/apache/maven/api/cli/mvn/MavenOptions.java
+++ 
b/api/maven-api-cli/src/main/java/org/apache/maven/api/cli/mvn/MavenOptions.java
@@ -20,7 +20,7 @@ package org.apache.maven.api.cli.mvn;
 
 import java.util.List;
 import java.util.Optional;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.api.annotations.Experimental;
 import org.apache.maven.api.annotations.Nonnull;
@@ -222,5 +222,5 @@ public interface MavenOptions extends Options {
      * @return a new MavenOptions instance with interpolated values
      */
     @Nonnull
-    MavenOptions interpolate(@Nonnull Function<String, String> callback);
+    MavenOptions interpolate(@Nonnull UnaryOperator<String> callback);
 }
diff --git 
a/api/maven-api-cli/src/main/java/org/apache/maven/api/cli/mvnenc/EncryptOptions.java
 
b/api/maven-api-cli/src/main/java/org/apache/maven/api/cli/mvnenc/EncryptOptions.java
index 5e9456397b..9a7da37502 100644
--- 
a/api/maven-api-cli/src/main/java/org/apache/maven/api/cli/mvnenc/EncryptOptions.java
+++ 
b/api/maven-api-cli/src/main/java/org/apache/maven/api/cli/mvnenc/EncryptOptions.java
@@ -20,7 +20,7 @@ package org.apache.maven.api.cli.mvnenc;
 
 import java.util.List;
 import java.util.Optional;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.api.annotations.Experimental;
 import org.apache.maven.api.annotations.Nonnull;
@@ -64,5 +64,5 @@ public interface EncryptOptions extends Options {
      * @return a new EncryptOptions instance with interpolated values
      */
     @Nonnull
-    EncryptOptions interpolate(Function<String, String> callback);
+    EncryptOptions interpolate(UnaryOperator<String> callback);
 }
diff --git 
a/api/maven-api-cli/src/main/java/org/apache/maven/api/cli/mvnsh/ShellOptions.java
 
b/api/maven-api-cli/src/main/java/org/apache/maven/api/cli/mvnsh/ShellOptions.java
index 4777229b88..4e1a63c6d7 100644
--- 
a/api/maven-api-cli/src/main/java/org/apache/maven/api/cli/mvnsh/ShellOptions.java
+++ 
b/api/maven-api-cli/src/main/java/org/apache/maven/api/cli/mvnsh/ShellOptions.java
@@ -18,7 +18,7 @@
  */
 package org.apache.maven.api.cli.mvnsh;
 
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.api.annotations.Experimental;
 import org.apache.maven.api.annotations.Nonnull;
@@ -39,5 +39,5 @@ public interface ShellOptions extends Options {
      * @return a new EncryptOptions instance with interpolated values
      */
     @Nonnull
-    ShellOptions interpolate(Function<String, String> callback);
+    ShellOptions interpolate(UnaryOperator<String> callback);
 }
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/Interpolator.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/Interpolator.java
index 18b6924b2f..790e938976 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/Interpolator.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/Interpolator.java
@@ -23,8 +23,9 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-import java.util.function.BiFunction;
+import java.util.function.BinaryOperator;
 import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.api.Service;
 import org.apache.maven.api.annotations.Experimental;
@@ -47,7 +48,7 @@ public interface Interpolator extends Service {
      * @param properties The map containing key-value pairs to be interpolated.
      * @param callback The function to resolve variable values not found in 
the map.
      */
-    default void interpolate(@Nonnull Map<String, String> properties, 
@Nullable Function<String, String> callback) {
+    default void interpolate(@Nonnull Map<String, String> properties, 
@Nullable UnaryOperator<String> callback) {
         interpolate(properties, callback, null, true);
     }
 
@@ -59,7 +60,7 @@ public interface Interpolator extends Service {
      * @param defaultsToEmpty If true, unresolved placeholders are replaced 
with empty strings. If false, they are left unchanged.
      */
     default void interpolate(
-            @Nonnull Map<String, String> map, @Nullable Function<String, 
String> callback, boolean defaultsToEmpty) {
+            @Nonnull Map<String, String> map, @Nullable UnaryOperator<String> 
callback, boolean defaultsToEmpty) {
         interpolate(map, callback, null, defaultsToEmpty);
     }
 
@@ -72,8 +73,8 @@ public interface Interpolator extends Service {
      */
     void interpolate(
             @Nonnull Map<String, String> map,
-            @Nullable Function<String, String> callback,
-            @Nullable BiFunction<String, String, String> postprocessor,
+            @Nullable UnaryOperator<String> callback,
+            @Nullable BinaryOperator<String> postprocessor,
             boolean defaultsToEmpty);
 
     /**
@@ -85,7 +86,7 @@ public interface Interpolator extends Service {
      * @return The interpolated string, or null if the input was null.
      */
     @Nullable
-    default String interpolate(@Nullable String val, @Nullable 
Function<String, String> callback) {
+    default String interpolate(@Nullable String val, @Nullable 
UnaryOperator<String> callback) {
         return interpolate(val, callback, false);
     }
 
@@ -99,7 +100,7 @@ public interface Interpolator extends Service {
      */
     @Nullable
     default String interpolate(
-            @Nullable String val, @Nullable Function<String, String> callback, 
boolean defaultsToEmpty) {
+            @Nullable String val, @Nullable UnaryOperator<String> callback, 
boolean defaultsToEmpty) {
         return interpolate(val, callback, null, defaultsToEmpty);
     }
 
@@ -114,8 +115,8 @@ public interface Interpolator extends Service {
     @Nullable
     String interpolate(
             @Nullable String val,
-            @Nullable Function<String, String> callback,
-            @Nullable BiFunction<String, String, String> postprocessor,
+            @Nullable UnaryOperator<String> callback,
+            @Nullable BinaryOperator<String> postprocessor,
             boolean defaultsToEmpty);
 
     /**
@@ -127,9 +128,9 @@ public interface Interpolator extends Service {
      *
      * @throws NullPointerException if the input collection is null or 
contains null elements.
      */
-    static Function<String, String> chain(Collection<? extends 
Function<String, String>> functions) {
+    static UnaryOperator<String> chain(Collection<? extends 
UnaryOperator<String>> functions) {
         return s -> {
-            for (Function<String, String> function : functions) {
+            for (UnaryOperator<String> function : functions) {
                 String v = function.apply(s);
                 if (v != null) {
                     return v;
@@ -140,7 +141,7 @@ public interface Interpolator extends Service {
     }
 
     @SafeVarargs
-    static Function<String, String> chain(Function<String, String>... 
functions) {
+    static UnaryOperator<String> chain(UnaryOperator<String>... functions) {
         return chain(List.of(functions));
     }
 
@@ -150,14 +151,14 @@ public interface Interpolator extends Service {
      * improving performance for repeated calls with the same input.
      *
      * @param callback The original function to be memoized. It takes a String 
as input and returns a String.
-     * @return A new {@code Function<String, String>} that caches the results 
of the original function.
+     * @return A new {@code UnaryOperator<String>} that caches the results of 
the original function.
      *         If the original function returns null for a given input, null 
will be cached and returned for subsequent calls with the same input.
      *
      * @see Function
      * @see Optional
      * @see HashMap#computeIfAbsent(Object, Function)
      */
-    static Function<String, String> memoize(Function<String, String> callback) 
{
+    static UnaryOperator<String> memoize(UnaryOperator<String> callback) {
         Map<String, Optional<String>> cache = new HashMap<>();
         return s -> cache.computeIfAbsent(s, v -> 
Optional.ofNullable(callback.apply(v)))
                 .orElse(null);
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/SettingsBuilderRequest.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/SettingsBuilderRequest.java
index d1c6750c45..311f922362 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/SettingsBuilderRequest.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/SettingsBuilderRequest.java
@@ -21,7 +21,7 @@ package org.apache.maven.api.services;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Optional;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.api.ProtoSession;
 import org.apache.maven.api.annotations.Experimental;
@@ -72,7 +72,7 @@ public interface SettingsBuilderRequest {
      * @return the interpolation source for interpolation
      */
     @Nonnull
-    Optional<Function<String, String>> getInterpolationSource();
+    Optional<UnaryOperator<String>> getInterpolationSource();
 
     @Nonnull
     static SettingsBuilderRequest build(
@@ -136,7 +136,7 @@ public interface SettingsBuilderRequest {
         Source installationSettingsSource;
         Source projectSettingsSource;
         Source userSettingsSource;
-        Function<String, String> interpolationSource;
+        UnaryOperator<String> interpolationSource;
 
         public SettingsBuilderRequestBuilder session(ProtoSession session) {
             this.session = session;
@@ -158,7 +158,7 @@ public interface SettingsBuilderRequest {
             return this;
         }
 
-        public SettingsBuilderRequestBuilder 
interpolationSource(Function<String, String> interpolationSource) {
+        public SettingsBuilderRequestBuilder 
interpolationSource(UnaryOperator<String> interpolationSource) {
             this.interpolationSource = interpolationSource;
             return this;
         }
@@ -177,7 +177,7 @@ public interface SettingsBuilderRequest {
             private final Source installationSettingsSource;
             private final Source projectSettingsSource;
             private final Source userSettingsSource;
-            private final Function<String, String> interpolationSource;
+            private final UnaryOperator<String> interpolationSource;
 
             @SuppressWarnings("checkstyle:ParameterNumber")
             DefaultSettingsBuilderRequest(
@@ -185,7 +185,7 @@ public interface SettingsBuilderRequest {
                     @Nullable Source installationSettingsSource,
                     @Nullable Source projectSettingsSource,
                     @Nullable Source userSettingsSource,
-                    @Nullable Function<String, String> interpolationSource) {
+                    @Nullable UnaryOperator<String> interpolationSource) {
                 super(session);
                 this.installationSettingsSource = installationSettingsSource;
                 this.projectSettingsSource = projectSettingsSource;
@@ -213,7 +213,7 @@ public interface SettingsBuilderRequest {
 
             @Nonnull
             @Override
-            public Optional<Function<String, String>> getInterpolationSource() 
{
+            public Optional<UnaryOperator<String>> getInterpolationSource() {
                 return Optional.ofNullable(interpolationSource);
             }
         }
diff --git 
a/compat/maven-embedder/src/main/java/org/apache/maven/cli/ExtensionConfigurationModule.java
 
b/compat/maven-embedder/src/main/java/org/apache/maven/cli/ExtensionConfigurationModule.java
index b0f4b9e9ba..85bcc8cb1c 100644
--- 
a/compat/maven-embedder/src/main/java/org/apache/maven/cli/ExtensionConfigurationModule.java
+++ 
b/compat/maven-embedder/src/main/java/org/apache/maven/cli/ExtensionConfigurationModule.java
@@ -18,7 +18,7 @@
  */
 package org.apache.maven.cli;
 
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import com.google.inject.Binder;
 import com.google.inject.Module;
@@ -36,10 +36,10 @@ import 
org.codehaus.plexus.configuration.PlexusConfiguration;
 public class ExtensionConfigurationModule implements Module {
 
     private final CoreExtensionEntry extension;
-    private final Function<String, String> callback;
+    private final UnaryOperator<String> callback;
     private final DefaultInterpolator interpolator = new DefaultInterpolator();
 
-    public ExtensionConfigurationModule(CoreExtensionEntry extension, 
Function<String, String> callback) {
+    public ExtensionConfigurationModule(CoreExtensionEntry extension, 
UnaryOperator<String> callback) {
         this.extension = extension;
         this.callback = callback;
     }
@@ -51,8 +51,8 @@ public class ExtensionConfigurationModule implements Module {
             if (configuration == null) {
                 configuration = new XmlNodeImpl("configuration");
             }
-            Function<String, String> cb = Interpolator.memoize(callback);
-            Function<String, String> it = s -> interpolator.interpolate(s, cb);
+            UnaryOperator<String> cb = Interpolator.memoize(callback);
+            UnaryOperator<String> it = s -> interpolator.interpolate(s, cb);
             configuration = new 
ExtensionInterpolator(it).transform(configuration);
 
             binder.bind(XmlNode.class)
@@ -65,7 +65,7 @@ public class ExtensionConfigurationModule implements Module {
     }
 
     static class ExtensionInterpolator extends MavenTransformer {
-        ExtensionInterpolator(Function<String, String> transformer) {
+        ExtensionInterpolator(UnaryOperator<String> transformer) {
             super(transformer);
         }
 
diff --git 
a/compat/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java 
b/compat/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
index 0b2d95ea2a..979b4a523a 100644
--- a/compat/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
+++ b/compat/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
@@ -45,7 +45,7 @@ import java.util.Properties;
 import java.util.ServiceLoader;
 import java.util.Set;
 import java.util.function.Consumer;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Stream;
@@ -643,7 +643,7 @@ public class MavenCli {
         populateProperties(cliRequest.commandLine, paths, 
cliRequest.systemProperties, cliRequest.userProperties);
 
         // now that we have properties, interpolate all arguments
-        Function<String, String> callback = v -> {
+        UnaryOperator<String> callback = v -> {
             String r = paths.getProperty(v);
             if (r == null) {
                 r = cliRequest.systemProperties.getProperty(v);
@@ -724,7 +724,7 @@ public class MavenCli {
 
         container.setLoggerManager(plexusLoggerManager);
 
-        Function<String, String> extensionSource = expression -> {
+        UnaryOperator<String> extensionSource = expression -> {
             String value = cliRequest.userProperties.getProperty(expression);
             if (value == null) {
                 value = cliRequest.systemProperties.getProperty(expression);
@@ -1660,7 +1660,7 @@ public class MavenCli {
         // 
----------------------------------------------------------------------
         // Load config files
         // 
----------------------------------------------------------------------
-        Function<String, String> callback =
+        UnaryOperator<String> callback =
                 or(paths::getProperty, prefix("cli.", 
commandLine::getOptionValue), systemProperties::getProperty);
 
         Path mavenConf;
@@ -1686,7 +1686,7 @@ public class MavenCli {
                 .forEach(k -> System.setProperty(k, 
userProperties.getProperty(k)));
     }
 
-    private static Function<String, String> prefix(String prefix, 
Function<String, String> cb) {
+    private static UnaryOperator<String> prefix(String prefix, 
UnaryOperator<String> cb) {
         return s -> {
             String v = null;
             if (s.startsWith(prefix)) {
@@ -1696,9 +1696,9 @@ public class MavenCli {
         };
     }
 
-    private static Function<String, String> or(Function<String, String>... 
callbacks) {
+    private static UnaryOperator<String> or(UnaryOperator<String>... 
callbacks) {
         return s -> {
-            for (Function<String, String> cb : callbacks) {
+            for (UnaryOperator<String> cb : callbacks) {
                 String r = cb.apply(s);
                 if (r != null) {
                     return r;
diff --git 
a/compat/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java
 
b/compat/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java
index a19c0f81d7..5dc8858b82 100644
--- 
a/compat/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java
+++ 
b/compat/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java
@@ -27,7 +27,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 import java.util.stream.Collectors;
 
 import org.apache.maven.RepositoryUtils;
@@ -139,7 +139,7 @@ public class BootstrapCoreExtensionManager {
             InternalSession.associate(repoSession, iSession);
 
             List<RemoteRepository> repositories = 
RepositoryUtils.toRepos(request.getPluginArtifactRepositories());
-            Function<String, String> interpolator = 
createInterpolator(request);
+            UnaryOperator<String> interpolator = createInterpolator(request);
 
             return resolveCoreExtensions(repoSession, repositories, 
providedArtifacts, extensions, interpolator);
         }
@@ -150,7 +150,7 @@ public class BootstrapCoreExtensionManager {
             List<RemoteRepository> repositories,
             Set<String> providedArtifacts,
             List<CoreExtension> configuration,
-            Function<String, String> interpolator)
+            UnaryOperator<String> interpolator)
             throws Exception {
         List<CoreExtensionEntry> extensions = new ArrayList<>();
 
@@ -208,7 +208,7 @@ public class BootstrapCoreExtensionManager {
             RepositorySystemSession repoSession,
             List<RemoteRepository> repositories,
             DependencyFilter dependencyFilter,
-            Function<String, String> interpolator)
+            UnaryOperator<String> interpolator)
             throws ExtensionResolutionException {
         try {
             /* TODO: Enhance the PluginDependenciesResolver to provide a
@@ -232,9 +232,9 @@ public class BootstrapCoreExtensionManager {
         }
     }
 
-    private static Function<String, String> 
createInterpolator(MavenExecutionRequest request) {
+    private static UnaryOperator<String> 
createInterpolator(MavenExecutionRequest request) {
         Interpolator interpolator = new DefaultInterpolator();
-        Function<String, String> callback = v -> {
+        UnaryOperator<String> callback = v -> {
             String r = request.getUserProperties().getProperty(v);
             if (r == null) {
                 r = request.getSystemProperties().getProperty(v);
diff --git 
a/compat/maven-embedder/src/main/java/org/apache/maven/cli/props/MavenProperties.java
 
b/compat/maven-embedder/src/main/java/org/apache/maven/cli/props/MavenProperties.java
index b2a9479331..0a1d955f86 100644
--- 
a/compat/maven-embedder/src/main/java/org/apache/maven/cli/props/MavenProperties.java
+++ 
b/compat/maven-embedder/src/main/java/org/apache/maven/cli/props/MavenProperties.java
@@ -42,7 +42,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.internal.impl.model.DefaultInterpolator;
 
@@ -81,7 +81,7 @@ public class MavenProperties extends AbstractMap<String, 
String> {
     private List<String> header;
     private List<String> footer;
     private Path location;
-    private Function<String, String> callback;
+    private UnaryOperator<String> callback;
     boolean substitute = true;
     boolean typed;
 
@@ -91,7 +91,7 @@ public class MavenProperties extends AbstractMap<String, 
String> {
         this(location, null);
     }
 
-    public MavenProperties(Path location, Function<String, String> callback) 
throws IOException {
+    public MavenProperties(Path location, UnaryOperator<String> callback) 
throws IOException {
         this.location = location;
         this.callback = callback;
         if (Files.exists(location)) {
@@ -474,7 +474,7 @@ public class MavenProperties extends AbstractMap<String, 
String> {
         substitute(callback);
     }
 
-    public void substitute(Function<String, String> callback) {
+    public void substitute(UnaryOperator<String> callback) {
         new DefaultInterpolator().interpolate(storage, callback);
     }
 
diff --git 
a/compat/maven-embedder/src/main/java/org/apache/maven/cli/props/MavenPropertiesLoader.java
 
b/compat/maven-embedder/src/main/java/org/apache/maven/cli/props/MavenPropertiesLoader.java
index d83f56850f..62bfe2c838 100644
--- 
a/compat/maven-embedder/src/main/java/org/apache/maven/cli/props/MavenPropertiesLoader.java
+++ 
b/compat/maven-embedder/src/main/java/org/apache/maven/cli/props/MavenPropertiesLoader.java
@@ -24,7 +24,7 @@ import java.nio.file.Path;
 import java.util.Enumeration;
 import java.util.Map;
 import java.util.StringTokenizer;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.internal.impl.model.DefaultInterpolator;
 
@@ -37,7 +37,7 @@ public class MavenPropertiesLoader {
             "maven.override."; // prefix that marks that system property 
should override defaults.
 
     public static void loadProperties(
-            java.util.Properties properties, Path path, Function<String, 
String> callback, boolean escape)
+            java.util.Properties properties, Path path, UnaryOperator<String> 
callback, boolean escape)
             throws IOException {
         MavenProperties sp = new MavenProperties(false);
         if (Files.exists(path)) {
@@ -50,7 +50,7 @@ public class MavenPropertiesLoader {
         sp.forEach(properties::setProperty);
     }
 
-    public static void substitute(MavenProperties props, Function<String, 
String> callback) {
+    public static void substitute(MavenProperties props, UnaryOperator<String> 
callback) {
         for (Enumeration<?> e = props.propertyNames(); e.hasMoreElements(); ) {
             String name = (String) e.nextElement();
             String value = props.getProperty(name);
@@ -67,8 +67,8 @@ public class MavenPropertiesLoader {
         props.keySet().removeIf(k -> k.startsWith(OVERRIDE_PREFIX));
     }
 
-    private static MavenProperties loadPropertiesFile(
-            Path path, boolean failIfNotFound, Function<String, String> 
callback) throws IOException {
+    private static MavenProperties loadPropertiesFile(Path path, boolean 
failIfNotFound, UnaryOperator<String> callback)
+            throws IOException {
         MavenProperties configProps = new MavenProperties(null, false);
         if (Files.exists(path) || failIfNotFound) {
             configProps.load(path);
@@ -78,7 +78,7 @@ public class MavenPropertiesLoader {
         return configProps;
     }
 
-    private static void loadIncludes(Path configProp, MavenProperties 
configProps, Function<String, String> callback)
+    private static void loadIncludes(Path configProp, MavenProperties 
configProps, UnaryOperator<String> callback)
             throws IOException {
         String includes = configProps.get(INCLUDES_PROPERTY);
         if (includes != null) {
@@ -162,7 +162,7 @@ public class MavenPropertiesLoader {
     }
 
     public static String substVars(
-            String value, String name, Map<String, String> props, 
Function<String, String> callback) {
+            String value, String name, Map<String, String> props, 
UnaryOperator<String> callback) {
         return DefaultInterpolator.substVars(value, name, null, props, 
callback, null, false);
     }
 }
diff --git 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/extensions/BootstrapCoreExtensionManager.java
 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/extensions/BootstrapCoreExtensionManager.java
index b5eb37166b..944504f304 100644
--- 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/extensions/BootstrapCoreExtensionManager.java
+++ 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/extensions/BootstrapCoreExtensionManager.java
@@ -24,7 +24,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 import java.util.stream.Collectors;
 
 import org.apache.maven.RepositoryUtils;
@@ -137,7 +137,7 @@ public class BootstrapCoreExtensionManager {
             InternalSession.associate(repoSession, iSession);
 
             List<RemoteRepository> repositories = 
RepositoryUtils.toRepos(request.getPluginArtifactRepositories());
-            Function<String, String> interpolator = 
createInterpolator(request);
+            UnaryOperator<String> interpolator = createInterpolator(request);
 
             return resolveCoreExtensions(repoSession, repositories, 
providedArtifacts, extensions, interpolator);
         }
@@ -148,7 +148,7 @@ public class BootstrapCoreExtensionManager {
             List<RemoteRepository> repositories,
             Set<String> providedArtifacts,
             List<CoreExtension> configuration,
-            Function<String, String> interpolator)
+            UnaryOperator<String> interpolator)
             throws Exception {
         List<CoreExtensionEntry> extensions = new ArrayList<>();
 
@@ -206,7 +206,7 @@ public class BootstrapCoreExtensionManager {
             RepositorySystemSession repoSession,
             List<RemoteRepository> repositories,
             DependencyFilter dependencyFilter,
-            Function<String, String> interpolator)
+            UnaryOperator<String> interpolator)
             throws ExtensionResolutionException {
         try {
             /* TODO: Enhance the PluginDependenciesResolver to provide a
@@ -230,9 +230,9 @@ public class BootstrapCoreExtensionManager {
         }
     }
 
-    private static Function<String, String> 
createInterpolator(MavenExecutionRequest request) {
+    private static UnaryOperator<String> 
createInterpolator(MavenExecutionRequest request) {
         Interpolator interpolator = new DefaultInterpolator();
-        Function<String, String> callback = v -> {
+        UnaryOperator<String> callback = v -> {
             String r = request.getUserProperties().getProperty(v);
             if (r == null) {
                 r = request.getSystemProperties().getProperty(v);
diff --git 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/extensions/ExtensionConfigurationModule.java
 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/extensions/ExtensionConfigurationModule.java
index 2b04b3abae..f9778a42ba 100644
--- 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/extensions/ExtensionConfigurationModule.java
+++ 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/extensions/ExtensionConfigurationModule.java
@@ -18,7 +18,7 @@
  */
 package org.apache.maven.cling.extensions;
 
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import com.google.inject.Binder;
 import com.google.inject.Module;
@@ -35,10 +35,10 @@ import 
org.codehaus.plexus.configuration.PlexusConfiguration;
 public class ExtensionConfigurationModule implements Module {
 
     private final CoreExtensionEntry extension;
-    private final Function<String, String> callback;
+    private final UnaryOperator<String> callback;
     private final DefaultInterpolator interpolator = new DefaultInterpolator();
 
-    public ExtensionConfigurationModule(CoreExtensionEntry extension, 
Function<String, String> callback) {
+    public ExtensionConfigurationModule(CoreExtensionEntry extension, 
UnaryOperator<String> callback) {
         this.extension = extension;
         this.callback = callback;
     }
@@ -50,8 +50,8 @@ public class ExtensionConfigurationModule implements Module {
             if (configuration == null) {
                 configuration = new XmlNodeImpl("configuration");
             }
-            Function<String, String> cb = Interpolator.memoize(callback);
-            Function<String, String> it = s -> interpolator.interpolate(s, cb);
+            UnaryOperator<String> cb = Interpolator.memoize(callback);
+            UnaryOperator<String> it = s -> interpolator.interpolate(s, cb);
             configuration = new 
ExtensionInterpolator(it).transform(configuration);
 
             binder.bind(XmlNode.class)
@@ -64,7 +64,7 @@ public class ExtensionConfigurationModule implements Module {
     }
 
     static class ExtensionInterpolator extends MavenTransformer {
-        ExtensionInterpolator(Function<String, String> transformer) {
+        ExtensionInterpolator(UnaryOperator<String> transformer) {
             super(transformer);
         }
 
diff --git 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/BaseParser.java 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/BaseParser.java
index 466237e043..27f4add0af 100644
--- 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/BaseParser.java
+++ 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/BaseParser.java
@@ -33,7 +33,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Properties;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 import java.util.stream.Collectors;
 
 import org.apache.maven.api.Constants;
@@ -264,7 +264,7 @@ public abstract class BaseParser implements Parser {
         // Load config files
         // 
----------------------------------------------------------------------
         Map<String, String> paths = context.extraInterpolationSource();
-        Function<String, String> callback =
+        UnaryOperator<String> callback =
                 or(paths::get, prefix("cli.", userSpecifiedProperties::get), 
context.systemProperties::get);
 
         Path mavenConf;
diff --git 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/LookupInvoker.java
 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/LookupInvoker.java
index 971e0cedbd..da4046a2dc 100644
--- 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/LookupInvoker.java
+++ 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/LookupInvoker.java
@@ -31,7 +31,7 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Properties;
 import java.util.function.Consumer;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.api.Constants;
 import org.apache.maven.api.ProtoSession;
@@ -563,7 +563,7 @@ public abstract class LookupInvoker<C extends 
LookupContext> implements Invoker
         context.projectSettingsPath = projectSettingsFile;
         context.userSettingsPath = userSettingsFile;
 
-        Function<String, String> interpolationSource = Interpolator.chain(
+        UnaryOperator<String> interpolationSource = Interpolator.chain(
                 context.protoSession.getUserProperties()::get, 
context.protoSession.getSystemProperties()::get);
         SettingsBuilderRequest settingsRequest = 
SettingsBuilderRequest.builder()
                 .session(context.protoSession)
diff --git 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/PlexusContainerCapsuleFactory.java
 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/PlexusContainerCapsuleFactory.java
index 56d6cc099f..c29bce1150 100644
--- 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/PlexusContainerCapsuleFactory.java
+++ 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/PlexusContainerCapsuleFactory.java
@@ -25,7 +25,7 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Module;
@@ -111,7 +111,7 @@ public class PlexusContainerCapsuleFactory<C extends 
LookupContext> implements C
 
         container.setLoggerManager(createLoggerManager());
         ProtoSession protoSession = context.protoSession;
-        Function<String, String> extensionSource = expression -> {
+        UnaryOperator<String> extensionSource = expression -> {
             String value = protoSession.getUserProperties().get(expression);
             if (value == null) {
                 value = protoSession.getSystemProperties().get(expression);
diff --git 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/Utils.java 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/Utils.java
index d4ab26da33..792e882068 100644
--- a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/Utils.java
+++ b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/Utils.java
@@ -25,7 +25,7 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.Properties;
 import java.util.ServiceLoader;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.api.annotations.Nonnull;
 import org.apache.maven.api.annotations.Nullable;
@@ -93,7 +93,7 @@ public final class Utils {
     }
 
     @Nonnull
-    public static Function<String, String> prefix(String prefix, 
Function<String, String> cb) {
+    public static UnaryOperator<String> prefix(String prefix, 
UnaryOperator<String> cb) {
         return s -> {
             String v = null;
             if (s.startsWith(prefix)) {
@@ -105,9 +105,9 @@ public final class Utils {
 
     @SafeVarargs
     @Nonnull
-    public static Function<String, String> or(Function<String, String>... 
callbacks) {
+    public static UnaryOperator<String> or(UnaryOperator<String>... callbacks) 
{
         return s -> {
-            for (Function<String, String> cb : callbacks) {
+            for (UnaryOperator<String> cb : callbacks) {
                 String r = cb.apply(s);
                 if (r != null) {
                     return r;
diff --git 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvn/CommonsCliMavenOptions.java
 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvn/CommonsCliMavenOptions.java
index c1885a6695..0ba2e6e0ab 100644
--- 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvn/CommonsCliMavenOptions.java
+++ 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvn/CommonsCliMavenOptions.java
@@ -22,7 +22,7 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Optional;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
@@ -44,8 +44,7 @@ public class CommonsCliMavenOptions extends CommonsCliOptions 
implements MavenOp
         super(source, cliManager, commandLine);
     }
 
-    private static CommonsCliMavenOptions interpolate(
-            CommonsCliMavenOptions options, Function<String, String> callback) 
{
+    private static CommonsCliMavenOptions interpolate(CommonsCliMavenOptions 
options, UnaryOperator<String> callback) {
         try {
             // now that we have properties, interpolate all arguments
             Interpolator interpolator = createInterpolator();
@@ -248,7 +247,7 @@ public class CommonsCliMavenOptions extends 
CommonsCliOptions implements MavenOp
     }
 
     @Override
-    public MavenOptions interpolate(Function<String, String> callback) {
+    public MavenOptions interpolate(UnaryOperator<String> callback) {
         return interpolate(this, callback);
     }
 
diff --git 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvn/LayeredMavenOptions.java
 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvn/LayeredMavenOptions.java
index d19157af04..353f795913 100644
--- 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvn/LayeredMavenOptions.java
+++ 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvn/LayeredMavenOptions.java
@@ -23,7 +23,7 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.api.cli.mvn.MavenOptions;
 import org.apache.maven.cling.invoker.LayeredOptions;
@@ -160,7 +160,7 @@ public class LayeredMavenOptions<O extends MavenOptions> 
extends LayeredOptions<
     }
 
     @Override
-    public MavenOptions interpolate(Function<String, String> callback) {
+    public MavenOptions interpolate(UnaryOperator<String> callback) {
         ArrayList<MavenOptions> interpolatedOptions = new 
ArrayList<>(options.size());
         for (MavenOptions o : options) {
             interpolatedOptions.add(o.interpolate(callback));
diff --git 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvnenc/CommonsCliEncryptOptions.java
 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvnenc/CommonsCliEncryptOptions.java
index 7059f8bafb..d67e93ec00 100644
--- 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvnenc/CommonsCliEncryptOptions.java
+++ 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvnenc/CommonsCliEncryptOptions.java
@@ -22,7 +22,7 @@ import java.util.List;
 import java.util.ListIterator;
 import java.util.Optional;
 import java.util.function.Consumer;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
@@ -50,7 +50,7 @@ public class CommonsCliEncryptOptions extends 
CommonsCliOptions implements Encry
     }
 
     private static CommonsCliEncryptOptions interpolate(
-            CommonsCliEncryptOptions options, Function<String, String> 
callback) {
+            CommonsCliEncryptOptions options, UnaryOperator<String> callback) {
         try {
             // now that we have properties, interpolate all arguments
             Interpolator interpolator = createInterpolator();
@@ -100,7 +100,7 @@ public class CommonsCliEncryptOptions extends 
CommonsCliOptions implements Encry
     }
 
     @Override
-    public EncryptOptions interpolate(Function<String, String> callback) {
+    public EncryptOptions interpolate(UnaryOperator<String> callback) {
         return interpolate(this, callback);
     }
 
diff --git 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvnsh/CommonsCliShellOptions.java
 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvnsh/CommonsCliShellOptions.java
index d64882896f..a45a973eaa 100644
--- 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvnsh/CommonsCliShellOptions.java
+++ 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvnsh/CommonsCliShellOptions.java
@@ -20,7 +20,7 @@ package org.apache.maven.cling.invoker.mvnsh;
 
 import java.util.List;
 import java.util.ListIterator;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
@@ -46,8 +46,7 @@ public class CommonsCliShellOptions extends CommonsCliOptions 
implements ShellOp
         super(source, cliManager, commandLine);
     }
 
-    private static CommonsCliShellOptions interpolate(
-            CommonsCliShellOptions options, Function<String, String> callback) 
{
+    private static CommonsCliShellOptions interpolate(CommonsCliShellOptions 
options, UnaryOperator<String> callback) {
         try {
             // now that we have properties, interpolate all arguments
             Interpolator interpolator = createInterpolator();
@@ -73,7 +72,7 @@ public class CommonsCliShellOptions extends CommonsCliOptions 
implements ShellOp
     }
 
     @Override
-    public ShellOptions interpolate(Function<String, String> callback) {
+    public ShellOptions interpolate(UnaryOperator<String> callback) {
         return interpolate(this, callback);
     }
 
diff --git 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/props/MavenProperties.java
 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/props/MavenProperties.java
index 2249477490..a7d624cc5d 100644
--- 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/props/MavenProperties.java
+++ 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/props/MavenProperties.java
@@ -42,7 +42,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.internal.impl.model.DefaultInterpolator;
 
@@ -80,7 +80,7 @@ public class MavenProperties extends AbstractMap<String, 
String> {
     private List<String> header;
     private List<String> footer;
     private Path location;
-    private Function<String, String> callback;
+    private UnaryOperator<String> callback;
     boolean substitute = true;
     boolean typed;
 
@@ -90,7 +90,7 @@ public class MavenProperties extends AbstractMap<String, 
String> {
         this(location, null);
     }
 
-    public MavenProperties(Path location, Function<String, String> callback) 
throws IOException {
+    public MavenProperties(Path location, UnaryOperator<String> callback) 
throws IOException {
         this.location = location;
         this.callback = callback;
         if (Files.exists(location)) {
@@ -473,7 +473,7 @@ public class MavenProperties extends AbstractMap<String, 
String> {
         substitute(callback);
     }
 
-    public void substitute(Function<String, String> callback) {
+    public void substitute(UnaryOperator<String> callback) {
         new DefaultInterpolator().interpolate(storage, callback);
     }
 
diff --git 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/props/MavenPropertiesLoader.java
 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/props/MavenPropertiesLoader.java
index df9b0a6d5a..3bfb64a639 100644
--- 
a/impl/maven-cli/src/main/java/org/apache/maven/cling/props/MavenPropertiesLoader.java
+++ 
b/impl/maven-cli/src/main/java/org/apache/maven/cling/props/MavenPropertiesLoader.java
@@ -24,7 +24,7 @@ import java.nio.file.Path;
 import java.util.Enumeration;
 import java.util.Map;
 import java.util.StringTokenizer;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.internal.impl.model.DefaultInterpolator;
 
@@ -36,7 +36,7 @@ public class MavenPropertiesLoader {
             "maven.override."; // prefix that marks that system property 
should override defaults.
 
     public static void loadProperties(
-            java.util.Properties properties, Path path, Function<String, 
String> callback, boolean escape)
+            java.util.Properties properties, Path path, UnaryOperator<String> 
callback, boolean escape)
             throws IOException {
         MavenProperties sp = new MavenProperties(false);
         if (Files.exists(path)) {
@@ -49,7 +49,7 @@ public class MavenPropertiesLoader {
         sp.forEach(properties::setProperty);
     }
 
-    public static void substitute(MavenProperties props, Function<String, 
String> callback) {
+    public static void substitute(MavenProperties props, UnaryOperator<String> 
callback) {
         for (Enumeration<?> e = props.propertyNames(); e.hasMoreElements(); ) {
             String name = (String) e.nextElement();
             String value = props.getProperty(name);
@@ -66,8 +66,8 @@ public class MavenPropertiesLoader {
         props.keySet().removeIf(k -> k.startsWith(OVERRIDE_PREFIX));
     }
 
-    private static MavenProperties loadPropertiesFile(
-            Path path, boolean failIfNotFound, Function<String, String> 
callback) throws IOException {
+    private static MavenProperties loadPropertiesFile(Path path, boolean 
failIfNotFound, UnaryOperator<String> callback)
+            throws IOException {
         MavenProperties configProps = new MavenProperties(null, false);
         if (Files.exists(path) || failIfNotFound) {
             configProps.load(path);
@@ -77,7 +77,7 @@ public class MavenPropertiesLoader {
         return configProps;
     }
 
-    private static void loadIncludes(Path configProp, MavenProperties 
configProps, Function<String, String> callback)
+    private static void loadIncludes(Path configProp, MavenProperties 
configProps, UnaryOperator<String> callback)
             throws IOException {
         String includes = configProps.get(INCLUDES_PROPERTY);
         if (includes != null) {
@@ -161,7 +161,7 @@ public class MavenPropertiesLoader {
     }
 
     public static String substVars(
-            String value, String name, Map<String, String> props, 
Function<String, String> callback) {
+            String value, String name, Map<String, String> props, 
UnaryOperator<String> callback) {
         return DefaultInterpolator.substVars(value, name, null, props, 
callback, null, false);
     }
 }
diff --git 
a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/DefaultPluginConfigurationExpander.java
 
b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/DefaultPluginConfigurationExpander.java
index 6a6b215323..3276bb9558 100644
--- 
a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/DefaultPluginConfigurationExpander.java
+++ 
b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/DefaultPluginConfigurationExpander.java
@@ -20,7 +20,7 @@ package org.apache.maven.internal.impl;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.api.di.Named;
 import org.apache.maven.api.di.Singleton;
@@ -90,7 +90,7 @@ public class DefaultPluginConfigurationExpander implements 
PluginConfigurationEx
         });
     }
 
-    static <T> List<T> map(List<T> list, Function<T, T> mapper) {
+    static <T> List<T> map(List<T> list, UnaryOperator<T> mapper) {
         List<T> newList = list;
         for (int i = 0; i < newList.size(); i++) {
             T oldT = newList.get(i);
diff --git 
a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/DefaultSettingsBuilder.java
 
b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/DefaultSettingsBuilder.java
index 397ce98531..1936ab647d 100644
--- 
a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/DefaultSettingsBuilder.java
+++ 
b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/DefaultSettingsBuilder.java
@@ -29,8 +29,8 @@ import java.nio.file.Paths;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.function.Function;
 import java.util.function.Supplier;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.api.Constants;
 import org.apache.maven.api.ProtoSession;
@@ -232,7 +232,7 @@ public class DefaultSettingsBuilder implements 
SettingsBuilder {
 
     private Settings interpolate(
             Settings settings, SettingsBuilderRequest request, 
ProblemCollector<BuilderProblem> problems) {
-        Function<String, String> src;
+        UnaryOperator<String> src;
         if (request.getInterpolationSource().isPresent()) {
             src = request.getInterpolationSource().get();
         } else {
@@ -245,7 +245,7 @@ public class DefaultSettingsBuilder implements 
SettingsBuilder {
     }
 
     static class DefSettingsTransformer extends SettingsTransformer {
-        DefSettingsTransformer(Function<String, String> transformer) {
+        DefSettingsTransformer(UnaryOperator<String> transformer) {
             super(transformer);
         }
 
@@ -267,7 +267,7 @@ public class DefaultSettingsBuilder implements 
SettingsBuilder {
         }
         SecDispatcher secDispatcher = new DefaultSecDispatcher(dispatchers, 
getSecuritySettings(request.getSession()));
         final AtomicInteger preMaven4Passwords = new AtomicInteger(0);
-        Function<String, String> decryptFunction = str -> {
+        UnaryOperator<String> decryptFunction = str -> {
             if (str != null && !str.isEmpty() && !str.contains("${") && 
secDispatcher.isAnyEncryptedString(str)) {
                 if (secDispatcher.isLegacyEncryptedString(str)) {
                     // add a problem
diff --git 
a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/DefaultToolchainsBuilder.java
 
b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/DefaultToolchainsBuilder.java
index 0bcf493cfd..7f67382568 100644
--- 
a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/DefaultToolchainsBuilder.java
+++ 
b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/DefaultToolchainsBuilder.java
@@ -24,7 +24,7 @@ import javax.xml.stream.XMLStreamException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Map;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.api.di.Inject;
 import org.apache.maven.api.di.Named;
@@ -156,7 +156,7 @@ public class DefaultToolchainsBuilder implements 
ToolchainsBuilder {
             ProblemCollector<BuilderProblem> problems) {
         Map<String, String> userProperties = 
request.getSession().getUserProperties();
         Map<String, String> systemProperties = 
request.getSession().getSystemProperties();
-        Function<String, String> src = Interpolator.chain(userProperties::get, 
systemProperties::get);
+        UnaryOperator<String> src = Interpolator.chain(userProperties::get, 
systemProperties::get);
         return new MavenToolchainsTransformer(value -> value != null ? 
interpolator.interpolate(value, src) : null)
                 .visit(toolchains);
     }
diff --git 
a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultInterpolator.java
 
b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultInterpolator.java
index f73d876c90..bb96532caf 100644
--- 
a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultInterpolator.java
+++ 
b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultInterpolator.java
@@ -22,8 +22,8 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
-import java.util.function.BiFunction;
-import java.util.function.Function;
+import java.util.function.BinaryOperator;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.api.annotations.Nullable;
 import org.apache.maven.api.di.Named;
@@ -43,8 +43,8 @@ public class DefaultInterpolator implements Interpolator {
     @Override
     public void interpolate(
             Map<String, String> map,
-            Function<String, String> callback,
-            BiFunction<String, String, String> postprocessor,
+            UnaryOperator<String> callback,
+            BinaryOperator<String> postprocessor,
             boolean defaultsToEmpty) {
         Map<String, String> org = new HashMap<>(map);
         for (String name : map.keySet()) {
@@ -68,10 +68,7 @@ public class DefaultInterpolator implements Interpolator {
 
     @Override
     public String interpolate(
-            String val,
-            Function<String, String> callback,
-            BiFunction<String, String, String> postprocessor,
-            boolean defaultsToEmpty) {
+            String val, UnaryOperator<String> callback, BinaryOperator<String> 
postprocessor, boolean defaultsToEmpty) {
         return interpolate(val, null, null, callback, postprocessor, 
defaultsToEmpty);
     }
 
@@ -80,8 +77,8 @@ public class DefaultInterpolator implements Interpolator {
             @Nullable String val,
             @Nullable String currentKey,
             @Nullable Set<String> cycleMap,
-            @Nullable Function<String, String> callback,
-            @Nullable BiFunction<String, String, String> postprocessor,
+            @Nullable UnaryOperator<String> callback,
+            @Nullable BinaryOperator<String> postprocessor,
             boolean defaultsToEmpty) {
         return substVars(val, currentKey, cycleMap, null, callback, 
postprocessor, defaultsToEmpty);
     }
@@ -92,7 +89,7 @@ public class DefaultInterpolator implements Interpolator {
      * @param properties the property set to perform substitution on
      * @param callback Callback for substitution
      */
-    public void performSubstitution(Map<String, String> properties, 
Function<String, String> callback) {
+    public void performSubstitution(Map<String, String> properties, 
UnaryOperator<String> callback) {
         performSubstitution(properties, callback, true);
     }
 
@@ -104,7 +101,7 @@ public class DefaultInterpolator implements Interpolator {
      * @param defaultsToEmptyString sets an empty string if a replacement 
value is not found, leaves intact otherwise
      */
     public void performSubstitution(
-            Map<String, String> properties, Function<String, String> callback, 
boolean defaultsToEmptyString) {
+            Map<String, String> properties, UnaryOperator<String> callback, 
boolean defaultsToEmptyString) {
         Map<String, String> org = new HashMap<>(properties);
         for (String name : properties.keySet()) {
             properties.compute(
@@ -166,7 +163,7 @@ public class DefaultInterpolator implements Interpolator {
             String currentKey,
             Set<String> cycleMap,
             Map<String, String> configProps,
-            Function<String, String> callback) {
+            UnaryOperator<String> callback) {
         return substVars(val, currentKey, cycleMap, configProps, callback, 
null, false);
     }
 
@@ -199,8 +196,8 @@ public class DefaultInterpolator implements Interpolator {
             String currentKey,
             Set<String> cycleMap,
             Map<String, String> configProps,
-            Function<String, String> callback,
-            BiFunction<String, String, String> postprocessor,
+            UnaryOperator<String> callback,
+            BinaryOperator<String> postprocessor,
             boolean defaultsToEmptyString) {
         return unescape(
                 doSubstVars(val, currentKey, cycleMap, configProps, callback, 
postprocessor, defaultsToEmptyString));
@@ -211,8 +208,8 @@ public class DefaultInterpolator implements Interpolator {
             String currentKey,
             Set<String> cycleMap,
             Map<String, String> configProps,
-            Function<String, String> callback,
-            BiFunction<String, String, String> postprocessor,
+            UnaryOperator<String> callback,
+            BinaryOperator<String> postprocessor,
             boolean defaultsToEmptyString) {
         if (val == null || val.isEmpty()) {
             return val;
@@ -291,8 +288,8 @@ public class DefaultInterpolator implements Interpolator {
             String org,
             Set<String> cycleMap,
             Map<String, String> configProps,
-            Function<String, String> callback,
-            BiFunction<String, String, String> postprocessor,
+            UnaryOperator<String> callback,
+            BinaryOperator<String> postprocessor,
             boolean defaultsToEmptyString) {
 
         // Process chained operators from left to right
@@ -365,8 +362,8 @@ public class DefaultInterpolator implements Interpolator {
             String variable,
             Set<String> cycleMap,
             Map<String, String> configProps,
-            Function<String, String> callback,
-            BiFunction<String, String, String> postprocessor,
+            UnaryOperator<String> callback,
+            BinaryOperator<String> postprocessor,
             boolean defaultsToEmptyString) {
 
         // Verify that this is not a recursive variable reference
diff --git 
a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java
 
b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java
index 0367d7fd37..4957626832 100644
--- 
a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java
+++ 
b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java
@@ -40,7 +40,6 @@ import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
 import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.function.UnaryOperator;
 import java.util.regex.Matcher;
@@ -1880,7 +1879,7 @@ public class DefaultModelBuilder implements ModelBuilder {
             Map<String, String> map1 = 
request.getSession().getUserProperties();
             Map<String, String> map2 = model.getProperties();
             Map<String, String> map3 = 
request.getSession().getSystemProperties();
-            Function<String, String> cb = Interpolator.chain(map1::get, 
map2::get, map3::get);
+            UnaryOperator<String> cb = Interpolator.chain(map1::get, 
map2::get, map3::get);
             try {
                 String interpolated =
                         
interpolator.interpolate(interpolatedModel.getParent().getVersion(), cb);
diff --git 
a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelInterpolator.java
 
b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelInterpolator.java
index 444b8c75c1..72fde20b36 100644
--- 
a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelInterpolator.java
+++ 
b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelInterpolator.java
@@ -26,8 +26,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
-import java.util.function.BiFunction;
+import java.util.function.BinaryOperator;
 import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.api.di.Inject;
 import org.apache.maven.api.di.Named;
@@ -110,8 +111,8 @@ public class DefaultModelInterpolator implements 
ModelInterpolator {
         Map<String, Optional<String>> cache = new HashMap<>();
         Function<String, Optional<String>> ucb =
                 v -> Optional.ofNullable(callback(model, projectDir, request, 
problems, v));
-        Function<String, String> cb = v -> cache.computeIfAbsent(v, 
ucb).orElse(null);
-        BiFunction<String, String, String> postprocessor = (e, v) -> 
postProcess(projectDir, request, e, v);
+        UnaryOperator<String> cb = v -> cache.computeIfAbsent(v, 
ucb).orElse(null);
+        BinaryOperator<String> postprocessor = (e, v) -> 
postProcess(projectDir, request, e, v);
         return value -> {
             try {
                 return interpolator.interpolate(value, cb, postprocessor, 
false);
diff --git 
a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelNormalizer.java
 
b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelNormalizer.java
index ea5c2cfb60..ae482df29d 100644
--- 
a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelNormalizer.java
+++ 
b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelNormalizer.java
@@ -23,7 +23,7 @@ import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.api.di.Named;
 import org.apache.maven.api.di.Singleton;
@@ -130,7 +130,7 @@ public class DefaultModelNormalizer implements 
ModelNormalizer {
     /**
      * Returns a list suited for the builders, i.e. null if not modified
      */
-    private <T> List<T> injectList(List<T> list, Function<T, T> modifer) {
+    private <T> List<T> injectList(List<T> list, UnaryOperator<T> modifer) {
         List<T> newList = null;
         for (int i = 0; i < list.size(); i++) {
             T oldT = list.get(i);
diff --git 
a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelPathTranslator.java
 
b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelPathTranslator.java
index 3d08148c13..1974beb419 100644
--- 
a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelPathTranslator.java
+++ 
b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelPathTranslator.java
@@ -22,7 +22,7 @@ import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.api.di.Inject;
 import org.apache.maven.api.di.Named;
@@ -88,7 +88,7 @@ public class DefaultModelPathTranslator implements 
ModelPathTranslator {
         return model;
     }
 
-    private <T> List<T> map(List<T> resources, Function<T, T> mapper) {
+    private <T> List<T> map(List<T> resources, UnaryOperator<T> mapper) {
         List<T> newResources = null;
         if (resources != null) {
             for (int i = 0; i < resources.size(); i++) {
diff --git 
a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/profile/ConditionParser.java
 
b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/profile/ConditionParser.java
index 6e649f0012..84e1a54419 100644
--- 
a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/profile/ConditionParser.java
+++ 
b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/profile/ConditionParser.java
@@ -21,7 +21,7 @@ package org.apache.maven.internal.impl.model.profile;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 /**
  * The {@code ConditionParser} class is responsible for parsing and evaluating 
expressions.
@@ -46,7 +46,7 @@ public class ConditionParser {
     }
 
     private final Map<String, ExpressionFunction> functions; // Map to store 
functions by their names
-    private final Function<String, String> propertyResolver; // Property 
resolver
+    private final UnaryOperator<String> propertyResolver; // Property resolver
     private List<String> tokens; // List of tokens derived from the expression
     private int current; // Keeps track of the current token index
 
@@ -56,7 +56,7 @@ public class ConditionParser {
      * @param functions a map of function names to their corresponding {@code 
ExpressionFunction} implementations
      * @param propertyResolver the property resolver
      */
-    public ConditionParser(Map<String, ExpressionFunction> functions, 
Function<String, String> propertyResolver) {
+    public ConditionParser(Map<String, ExpressionFunction> functions, 
UnaryOperator<String> propertyResolver) {
         this.functions = functions;
         this.propertyResolver = propertyResolver;
     }
diff --git 
a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/profile/ConditionProfileActivator.java
 
b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/profile/ConditionProfileActivator.java
index 7070905a2e..eb5787e4f9 100644
--- 
a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/profile/ConditionProfileActivator.java
+++ 
b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/profile/ConditionProfileActivator.java
@@ -20,7 +20,7 @@ package org.apache.maven.internal.impl.model.profile;
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.api.di.Inject;
 import org.apache.maven.api.di.Named;
@@ -73,7 +73,7 @@ public class ConditionProfileActivator implements 
ProfileActivator {
         String condition = profile.getActivation().getCondition();
         try {
             Map<String, ConditionParser.ExpressionFunction> functions = 
registerFunctions(context, versionParser);
-            Function<String, String> propertyResolver = s -> property(context, 
s);
+            UnaryOperator<String> propertyResolver = s -> property(context, s);
             return toBoolean(new ConditionParser(functions, 
propertyResolver).parse(condition));
         } catch (Exception e) {
             problems.add(
diff --git 
a/impl/maven-impl/src/test/java/org/apache/maven/internal/impl/model/DefaultInterpolatorTest.java
 
b/impl/maven-impl/src/test/java/org/apache/maven/internal/impl/model/DefaultInterpolatorTest.java
index 9a0c9c70a6..bbdd861773 100644
--- 
a/impl/maven-impl/src/test/java/org/apache/maven/internal/impl/model/DefaultInterpolatorTest.java
+++ 
b/impl/maven-impl/src/test/java/org/apache/maven/internal/impl/model/DefaultInterpolatorTest.java
@@ -21,7 +21,7 @@ package org.apache.maven.internal.impl.model;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.api.services.InterpolatorException;
 import org.junit.jupiter.api.Test;
@@ -207,7 +207,7 @@ class DefaultInterpolatorTest {
         performSubstitution(props, null);
     }
 
-    private void performSubstitution(Map<String, String> props, 
Function<String, String> callback) {
+    private void performSubstitution(Map<String, String> props, 
UnaryOperator<String> callback) {
         new DefaultInterpolator().performSubstitution(props, callback);
     }
 
@@ -215,7 +215,7 @@ class DefaultInterpolatorTest {
             String val,
             String currentKey,
             Map<String, String> configProps,
-            Function<String, String> callback,
+            UnaryOperator<String> callback,
             boolean defaultsToEmptyString) {
         return new DefaultInterpolator()
                 .substVars(val, currentKey, null, configProps, callback, null, 
defaultsToEmptyString);
diff --git 
a/impl/maven-impl/src/test/java/org/apache/maven/internal/impl/model/profile/ConditionParserTest.java
 
b/impl/maven-impl/src/test/java/org/apache/maven/internal/impl/model/profile/ConditionParserTest.java
index c2887d96f7..1cd3bf1201 100644
--- 
a/impl/maven-impl/src/test/java/org/apache/maven/internal/impl/model/profile/ConditionParserTest.java
+++ 
b/impl/maven-impl/src/test/java/org/apache/maven/internal/impl/model/profile/ConditionParserTest.java
@@ -19,7 +19,7 @@
 package org.apache.maven.internal.impl.model.profile;
 
 import java.util.Map;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.maven.api.model.Model;
 import org.apache.maven.api.services.model.ProfileActivationContext;
@@ -43,7 +43,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 class ConditionParserTest {
     ConditionParser parser;
     Map<String, ExpressionFunction> functions;
-    Function<String, String> propertyResolver;
+    UnaryOperator<String> propertyResolver;
 
     @BeforeEach
     void setUp() {
diff --git a/src/mdo/transformer.vm b/src/mdo/transformer.vm
index 04b6b707b8..93178d5614 100644
--- a/src/mdo/transformer.vm
+++ b/src/mdo/transformer.vm
@@ -40,7 +40,7 @@ import java.util.Map;
 import java.util.Properties;
 import java.util.Objects;
 import java.util.function.BinaryOperator;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
@@ -54,9 +54,9 @@ import org.apache.maven.internal.xml.XmlNodeImpl;
 @Generated
 public class ${className} {
 
-    private final Function<String, String> transformer;
+    private final UnaryOperator<String> transformer;
 
-    public ${className}(Function<String, String> transformer) {
+    public ${className}(UnaryOperator<String> transformer) {
         this.transformer = transformer;
     }
 
@@ -141,7 +141,7 @@ public class ${className} {
 
   #end
 #end
-    protected <T> List<T> transform(List<T> list, Function<T, T> transformer) {
+    protected <T> List<T> transform(List<T> list, UnaryOperator<T> 
transformer) {
         List<T> newList = list;
         for (int i = 0; i < list.size(); i++) {
             T oldVal = list.get(i);
@@ -156,7 +156,7 @@ public class ${className} {
         return newList;
     }
 
-    protected <T> Map<String, T> transform(Map<String, T> map, Function<T, T> 
transformer) {
+    protected <T> Map<String, T> transform(Map<String, T> map, 
UnaryOperator<T> transformer) {
         Map<String, T> newMap = map;
         for (String key : map.keySet()) {
             T oldVal = map.get(key);

Reply via email to