You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2022/12/11 21:47:47 UTC

[sis] branch geoapi-4.0 updated: Replace `Collections.singletonMap(…)` by `Map.of(…)` where applicabie. There is two cases where we don't do the replacement: - When the map needs to accept null values. - When the check for null value will be better done (with a better error message) by `IdentifiedObject` constructor.

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

desruisseaux pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git


The following commit(s) were added to refs/heads/geoapi-4.0 by this push:
     new 9a73feaadc Replace `Collections.singletonMap(…)` by `Map.of(…)` where applicabie. There is two cases where we don't do the replacement: - When the map needs to accept null values. - When the check for null value will be better done (with a better error message) by `IdentifiedObject` constructor.
9a73feaadc is described below

commit 9a73feaadcca81f3e1b2d7a547d233511b051202
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Sun Dec 11 22:45:44 2022 +0100

    Replace `Collections.singletonMap(…)` by `Map.of(…)` where applicabie.
    There is two cases where we don't do the replacement:
    - When the map needs to accept null values.
    - When the check for null value will be better done (with a better error message) by `IdentifiedObject` constructor.
---
 .../apache/sis/gui/coverage/CoverageExplorer.java  |  5 ++--
 .../sis/gui/metadata/StandardMetadataTree.java     |  6 ++---
 .../apache/sis/coverage/grid/GridExtentCRS.java    |  3 +--
 .../org/apache/sis/feature/FeatureOperations.java  |  2 +-
 .../sis/feature/builder/FeatureTypeBuilder.java    |  2 +-
 .../internal/coverage/j2d/DeferredProperty.java    |  4 +--
 .../sis/internal/feature/MovingFeatures.java       |  7 ++---
 .../internal/feature/SpatialOperationContext.java  |  5 ++--
 .../java/org/apache/sis/internal/filter/Node.java  |  1 +
 .../sis/coverage/grid/GridDerivationTest.java      |  8 +++---
 .../apache/sis/feature/AbstractOperationTest.java  |  4 +--
 .../sis/feature/CharacteristicTypeMapTest.java     | 15 +++++------
 .../sis/feature/DefaultAssociationRoleTest.java    | 17 ++++++------
 .../sis/feature/DefaultAttributeTypeTest.java      |  5 ++--
 .../apache/sis/feature/DefaultFeatureTypeTest.java |  3 +--
 .../org/apache/sis/feature/FeatureFormatTest.java  |  3 +--
 .../apache/sis/feature/FeatureMemoryBenchmark.java | 11 ++++----
 .../apache/sis/feature/FeatureOperationsTest.java  |  3 +--
 .../org/apache/sis/feature/FeatureTestCase.java    |  8 +++---
 .../org/apache/sis/feature/LinkOperationTest.java  |  6 ++---
 .../apache/sis/feature/PropertySingletonTest.java  |  5 ++--
 .../sis/feature/SingletonAssociationTest.java      | 19 +++++--------
 .../sis/feature/StringJoinOperationTest.java       |  3 +--
 .../feature/builder/FeatureTypeBuilderTest.java    |  4 +--
 .../internal/feature/AttributeConventionTest.java  | 19 +++++++------
 .../apache/sis/internal/feature/jts/JTSTest.java   |  4 +--
 .../apache/sis/internal/jaxb/TypeRegistration.java |  3 +--
 .../sis/internal/metadata/RecordSchemaSIS.java     |  5 ++--
 .../main/java/org/apache/sis/util/iso/Names.java   |  4 +--
 .../src/main/java/org/apache/sis/xml/XML.java      |  3 +--
 .../internal/jaxb/cat/CodeListMarshallingTest.java |  4 +--
 .../sis/internal/jaxb/gco/MultiplicityTest.java    |  4 +--
 .../apache/sis/internal/metadata/MergerTest.java   |  6 ++---
 .../identification/DefaultBrowseGraphicTest.java   |  7 ++---
 .../iso/quality/DefaultQuantitativeResultTest.java | 11 ++++----
 .../apache/sis/util/iso/DefaultRecordTypeTest.java |  4 +--
 .../apache/sis/util/iso/NameMarshallingTest.java   |  4 +--
 .../jaxb/referencing/CC_OperationMethod.java       |  3 +--
 .../referencing/GeodeticObjectBuilder.java         |  5 ++--
 .../apache/sis/internal/referencing/Legacy.java    | 10 +++----
 .../internal/referencing/ReferencingUtilities.java |  4 +--
 .../sis/internal/referencing/provider/Affine.java  |  6 ++---
 .../provider/FranceGeocentricInterpolation.java    |  6 ++---
 .../internal/referencing/provider/Molodensky.java  |  3 +--
 .../apache/sis/io/wkt/GeodeticObjectParser.java    |  6 ++---
 .../java/org/apache/sis/io/wkt/VerticalInfo.java   |  3 +--
 .../sis/parameter/MapProjectionParameters.java     | 13 +++++----
 .../org/apache/sis/parameter/TensorParameters.java |  5 ++--
 .../java/org/apache/sis/referencing/CommonCRS.java |  2 +-
 .../org/apache/sis/referencing/cs/Normalizer.java  |  3 +--
 .../factory/MultiAuthoritiesFactory.java           |  2 +-
 .../operation/CoordinateOperationFinder.java       |  2 +-
 .../operation/DefaultOperationMethod.java          |  3 +--
 .../transform/CoordinateSystemTransform.java       |  3 +--
 .../transform/EllipsoidToCentricTransform.java     |  5 ++--
 .../operation/transform/MathTransformProvider.java |  2 +-
 .../operation/transform/PoleRotation.java          |  6 ++---
 .../org/apache/sis/geometry/EnvelopesTest.java     |  4 +--
 .../CC_OperationParameterGroupTest.java            |  3 +--
 .../referencing/SecondDefiningParameterTest.java   | 16 ++++++-----
 .../referencing/EllipsoidalHeightCombinerTest.java |  7 +++--
 .../sis/internal/referencing/FormulasTest.java     |  7 ++---
 .../java/org/apache/sis/io/wkt/WKTFormatTest.java  |  7 ++---
 .../DefaultParameterDescriptorGroupTest.java       |  9 +++----
 .../parameter/DefaultParameterValueGroupTest.java  | 12 ++++-----
 .../sis/parameter/MapProjectionParametersTest.java |  3 +--
 .../sis/parameter/ParameterMarshallingTest.java    |  7 +++--
 .../org/apache/sis/parameter/ParametersTest.java   |  6 ++---
 .../apache/sis/parameter/TensorParametersTest.java |  3 +--
 .../org/apache/sis/parameter/TensorValuesTest.java | 10 +++----
 .../sis/referencing/crs/AbstractCRSTest.java       | 10 +++----
 .../referencing/crs/DefaultCompoundCRSTest.java    | 23 ++++++++--------
 .../sis/referencing/crs/DefaultDerivedCRSTest.java |  4 +--
 .../referencing/crs/DefaultEngineeringCRSTest.java | 10 +++----
 .../sis/referencing/crs/DefaultImageCRSTest.java   | 10 +++----
 .../referencing/crs/DefaultTemporalCRSTest.java    |  6 ++---
 .../apache/sis/referencing/crs/HardCodedCRS.java   | 11 ++++----
 .../apache/sis/referencing/cs/AbstractCSTest.java  | 18 ++++++-------
 .../sis/referencing/cs/CoordinateSystemsTest.java  | 16 +++++------
 .../sis/referencing/cs/DefaultCartesianCSTest.java |  9 +++----
 .../sis/referencing/cs/DefaultCompoundCSTest.java  |  5 ++--
 .../cs/DefaultCoordinateSystemAxisTest.java        |  4 +--
 .../referencing/cs/DefaultCylindricalCSTest.java   |  4 +--
 .../sis/referencing/cs/DefaultPolarCSTest.java     |  4 +--
 .../sis/referencing/cs/DefaultSphericalCSTest.java |  4 +--
 .../org/apache/sis/referencing/cs/HardCodedCS.java | 31 +++++++++++-----------
 .../apache/sis/referencing/cs/NormalizerTest.java  |  8 +++---
 .../datum/DefaultPrimeMeridianTest.java            |  5 ++--
 .../datum/DefaultVerticalDatumTest.java            | 11 ++++----
 .../factory/GeodeticObjectFactoryTest.java         |  3 +--
 .../factory/IdentifiedObjectFinderTest.java        |  4 +--
 .../factory/sql/epsg/DataScriptFormatter.java      |  3 +--
 .../operation/CoordinateOperationFinderTest.java   |  3 +--
 .../DefaultConcatenatedOperationTest.java          | 12 ++++-----
 .../operation/DefaultConversionTest.java           | 13 +++++----
 .../operation/HardCodedConversions.java            |  7 +++--
 .../builder/LinearTransformBuilderTest.java        |  7 +++--
 .../sis/referencing/operation/projection/NoOp.java |  6 ++---
 .../projection/SatelliteTrackingTest.java          |  4 +--
 .../transform/DefaultMathTransformFactoryTest.java |  3 +--
 .../operation/transform/SinusoidalShiftGrid.java   |  4 +--
 .../transform/WraparoundTransformTest.java         | 10 +++----
 .../apache/sis/internal/util/DefinitionURI.java    |  3 +--
 .../java/org/apache/sis/measure/UnitDimension.java |  4 +--
 .../java/org/apache/sis/measure/UnitFormat.java    |  2 +-
 .../sis/util/DefaultInternationalString.java       | 10 ++++---
 .../sis/util/collection/DefaultTreeTable.java      | 16 ++++++-----
 .../apache/sis/util/collection/TableColumn.java    |  3 +--
 .../org/apache/sis/measure/SystemUnitTest.java     |  3 +--
 .../org/apache/sis/measure/UnitDimensionTest.java  |  3 +--
 .../org/apache/sis/storage/geotiff/CRSBuilder.java |  5 ++--
 .../apache/sis/storage/geotiff/XMLMetadata.java    |  4 +--
 .../org/apache/sis/internal/netcdf/CRSBuilder.java |  3 +--
 .../apache/sis/internal/netcdf/GridMapping.java    |  3 +--
 .../apache/sis/internal/sql/feature/Analyzer.java  |  3 +--
 .../org/apache/sis/internal/storage/csv/Store.java |  5 ++--
 .../apache/sis/internal/storage/folder/Store.java  |  3 +--
 .../org/apache/sis/internal/storage/xml/Store.java |  3 +--
 .../sis/storage/aggregate/JoinFeatureSet.java      | 13 +++++----
 .../internal/storage/xml/MimeTypeDetectorTest.java | 11 ++++----
 .../storage/gpx/GroupAsPolylineOperation.java      |  6 ++---
 .../org/apache/sis/internal/storage/gpx/Types.java |  5 ++--
 122 files changed, 368 insertions(+), 425 deletions(-)

diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/CoverageExplorer.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/CoverageExplorer.java
index afcf1f213c..d4bcfba71c 100644
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/CoverageExplorer.java
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/CoverageExplorer.java
@@ -16,9 +16,9 @@
  */
 package org.apache.sis.gui.coverage;
 
+import java.util.Map;
 import java.util.EnumMap;
 import java.util.Optional;
-import java.util.Collections;
 import java.awt.image.RenderedImage;
 import javafx.application.Platform;
 import javafx.beans.DefaultProperty;
@@ -612,8 +612,7 @@ public class CoverageExplorer extends Widget {
                     name = e.getClass().getSimpleName();
                 }
             }
-            referenceSystems.setGridReferencing(true,
-                    Collections.singletonMap(name, coverage.getGridGeometry()));
+            referenceSystems.setGridReferencing(true, Map.of(name, coverage.getGridGeometry()));
         }
         /*
          * Following calls will NOT forward the new values to the views because this `notifyDataChanged(…)`
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/metadata/StandardMetadataTree.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/metadata/StandardMetadataTree.java
index 98963bd146..068ea65ad3 100644
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/metadata/StandardMetadataTree.java
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/metadata/StandardMetadataTree.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.gui.metadata;
 
-import java.util.Collections;
+import java.util.Map;
 import java.io.StringWriter;
 import javax.xml.transform.stream.StreamResult;
 import javafx.event.ActionEvent;
@@ -198,8 +198,8 @@ public class StandardMetadataTree extends MetadataTree {
                             content.put(DataFormats.XML, text);
                         } else if (source == copyAsLegacy) {                    // ISO 19139:2007.
                             final StringWriter output = new StringWriter();
-                            XML.marshal(obj, new StreamResult(output),
-                                    Collections.singletonMap(XML.METADATA_VERSION, LegacyNamespaces.VERSION_2007));
+                            XML.marshal(obj, new StreamResult(output), Map.of(
+                                        XML.METADATA_VERSION, LegacyNamespaces.VERSION_2007));
                             text = output.toString();
                             content.put(DataFormats.ISO_19139, text);
                         } else {
diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridExtentCRS.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridExtentCRS.java
index 62e256304e..0163934957 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridExtentCRS.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridExtentCRS.java
@@ -18,7 +18,6 @@ package org.apache.sis.coverage.grid;
 
 import java.util.Map;
 import java.util.HashMap;
-import java.util.Collections;
 import java.util.Locale;
 import org.opengis.util.FactoryException;
 import org.opengis.util.InternationalString;
@@ -210,7 +209,7 @@ final class GridExtentCRS {
      * Creates a properties map to give to CS, CRS or datum constructors.
      */
     private static Map<String,?> properties(final Object name) {
-        return Collections.singletonMap(IdentifiedObject.NAME_KEY, name);
+        return Map.of(IdentifiedObject.NAME_KEY, name);
     }
 
     /**
diff --git a/core/sis-feature/src/main/java/org/apache/sis/feature/FeatureOperations.java b/core/sis-feature/src/main/java/org/apache/sis/feature/FeatureOperations.java
index 8b61282c57..113dcfd216 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/FeatureOperations.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/FeatureOperations.java
@@ -140,7 +140,7 @@ public final class FeatureOperations extends Static {
      *   AttributeType licensePlateNumber = ...;            // Attribute creation omitted for brevity
      *   FeatureType car = new DefaultFeatureType(...,      // Arguments omitted for brevity
      *           licensePlateNumber, model, owner,
-     *           FeatureOperations.link(singletonMap(NAME_KEY, "identifier"), licensePlateNumber);
+     *           FeatureOperations.link(Map.of(NAME_KEY, "identifier"), licensePlateNumber);
      * }
      * </div>
      *
diff --git a/core/sis-feature/src/main/java/org/apache/sis/feature/builder/FeatureTypeBuilder.java b/core/sis-feature/src/main/java/org/apache/sis/feature/builder/FeatureTypeBuilder.java
index 9b83bdac66..c5fa60f4f9 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/feature/builder/FeatureTypeBuilder.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/feature/builder/FeatureTypeBuilder.java
@@ -1002,7 +1002,7 @@ public class FeatureTypeBuilder extends TypeBuilder {
      * Helper method for creating identification info of synthetic attributes.
      */
     private static Map<String,?> name(final GenericName name) {
-        return Collections.singletonMap(AbstractOperation.NAME_KEY, name);
+        return Map.of(AbstractOperation.NAME_KEY, name);
     }
 
     /**
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/j2d/DeferredProperty.java b/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/j2d/DeferredProperty.java
index 5a2b99ae01..74737f26df 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/j2d/DeferredProperty.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/j2d/DeferredProperty.java
@@ -17,7 +17,6 @@
 package org.apache.sis.internal.coverage.j2d;
 
 import java.util.Map;
-import java.util.Collections;
 import java.util.function.Function;
 import java.awt.image.RenderedImage;
 import org.apache.sis.image.PlanarImage;
@@ -84,8 +83,7 @@ public final class DeferredProperty {
      * @return a deferred property for computing the grid geometry of an image.
      */
     public static Map<String,Object> forGridGeometry(final GridGeometry grid, final int[] dimensions) {
-        return Collections.singletonMap(PlanarImage.GRID_GEOMETRY_KEY,
-                new DeferredProperty(new ImageGeometry(grid, dimensions)));
+        return Map.of(PlanarImage.GRID_GEOMETRY_KEY, new DeferredProperty(new ImageGeometry(grid, dimensions)));
     }
 
     /**
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/MovingFeatures.java b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/MovingFeatures.java
index e2dfdb66e9..fec27f404f 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/MovingFeatures.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/MovingFeatures.java
@@ -18,9 +18,7 @@ package org.apache.sis.internal.feature;
 
 import java.util.Map;
 import java.util.HashMap;
-import java.util.Collections;
 import java.time.Instant;
-import org.opengis.util.LocalName;
 import org.apache.sis.util.iso.Names;
 import org.apache.sis.math.Vector;
 import org.apache.sis.feature.DefaultAttributeType;
@@ -57,9 +55,8 @@ public class MovingFeatures {
      */
     private static final AttributeType<Number> TIME_AS_NUMBERS;
     static {
-        final LocalName scope = Names.createLocalName("OGC", null, "MF");
-        final Map<String,Object> properties = Collections.singletonMap(
-                DefaultAttributeType.NAME_KEY, Names.createScopedName(scope, null, "datetimes"));
+        final var scope = Names.createLocalName("OGC", null, "MF");
+        final var properties = Map.of(DefaultAttributeType.NAME_KEY, Names.createScopedName(scope, null, "datetimes"));
         TIME_AS_INSTANTS = new DefaultAttributeType<>(properties, Instant.class, 0, Integer.MAX_VALUE, null);
         TIME_AS_NUMBERS  = new DefaultAttributeType<>(properties,  Number.class, 0, Integer.MAX_VALUE, null);
     }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/SpatialOperationContext.java b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/SpatialOperationContext.java
index 6b0b4b8e45..abdb6eb1a9 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/SpatialOperationContext.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/SpatialOperationContext.java
@@ -17,7 +17,6 @@
 package org.apache.sis.internal.feature;
 
 import java.io.Serializable;
-import java.util.Collections;
 import java.util.Map;
 import javax.measure.Unit;
 import javax.measure.IncommensurableException;
@@ -364,8 +363,8 @@ select: if (commonCRS == null) {
             final ReferencingFactoryContainer f = new ReferencingFactoryContainer();
             method = f.getCoordinateOperationFactory().getOperationMethod("Mercator_2SP");
             cartCS = f.getStandardProjectedCS();
-            name   = Collections.singletonMap(DefaultConversion.NAME_KEY,
-                        new ImmutableIdentifier(Citations.SIS, "SIS", "Mercator for geometry"));
+            name   = Map.of(DefaultConversion.NAME_KEY,
+                            new ImmutableIdentifier(Citations.SIS, "SIS", "Mercator for geometry"));
         }
 
         /**
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/Node.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/Node.java
index dfcf7164b5..4fe8e0e1f7 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/Node.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/Node.java
@@ -87,6 +87,7 @@ public abstract class Node implements Serializable {
      * @see Expression#getFunctionName()
      */
     protected static <T> AttributeType<T> createType(final Class<T> type, final Object name) {
+        // We do not use `Map.of(…)` for letting the attribute type constructor do the null check.
         return new DefaultAttributeType<>(Collections.singletonMap(DefaultAttributeType.NAME_KEY, name),
                                           type, 1, 1, null, (AttributeType<?>[]) null);
     }
diff --git a/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridDerivationTest.java b/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridDerivationTest.java
index 8bf4b8d158..2444bef57d 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridDerivationTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridDerivationTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.coverage.grid;
 
-import java.util.Collections;
+import java.util.Map;
 import java.util.stream.DoubleStream;
 import java.util.stream.IntStream;
 import org.opengis.geometry.DirectPosition;
@@ -588,11 +588,11 @@ public final strictfp class GridDerivationTest extends TestCase {
          * for any point INSIDE the envelope, it's non-determinist about points perfectly aligned on the edge.
          * So, here we will test a point very near to the envelope edge, but still into it.
          */
-        final GeneralEnvelope grid3d = new GeneralEnvelope(3);
+        final var grid3d = new GeneralEnvelope(3);
         grid3d.setEnvelope(0, 0, 0, 1920, 1080, 4);
 
-        final DefaultCompoundCRS crs3d = new DefaultCompoundCRS(
-                Collections.singletonMap("name", "geo3d"),
+        final var crs3d = new DefaultCompoundCRS(
+                Map.of("name", "geo3d"),
                 HardCodedCRS.WGS84,
                 HardCodedCRS.TIME);
 
diff --git a/core/sis-feature/src/test/java/org/apache/sis/feature/AbstractOperationTest.java b/core/sis-feature/src/test/java/org/apache/sis/feature/AbstractOperationTest.java
index a4c3346666..853d4a4dd6 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/AbstractOperationTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/AbstractOperationTest.java
@@ -16,13 +16,13 @@
  */
 package org.apache.sis.feature;
 
+import java.util.Map;
 import org.opengis.parameter.ParameterDescriptor;
 import org.apache.sis.parameter.ParameterBuilder;
 import org.apache.sis.test.DependsOn;
 import org.apache.sis.test.TestCase;
 import org.junit.Test;
 
-import static java.util.Collections.singletonMap;
 import static org.apache.sis.test.Assert.*;
 
 
@@ -44,7 +44,7 @@ public final strictfp class AbstractOperationTest extends TestCase {
         final ParameterDescriptor<?>[] parameters = {
             builder.addName("founder").create(String.class, null)
         };
-        return new NoOperation(singletonMap(AbstractOperation.NAME_KEY, "new city"),
+        return new NoOperation(Map.of(AbstractOperation.NAME_KEY, "new city"),
                 builder.addName("create").createGroup(parameters),
                 DefaultAttributeTypeTest.city());
     }
diff --git a/core/sis-feature/src/test/java/org/apache/sis/feature/CharacteristicTypeMapTest.java b/core/sis-feature/src/test/java/org/apache/sis/feature/CharacteristicTypeMapTest.java
index 86cb6d5825..8246b7add6 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/CharacteristicTypeMapTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/CharacteristicTypeMapTest.java
@@ -22,7 +22,6 @@ import org.apache.sis.test.DependsOn;
 import org.apache.sis.test.TestCase;
 import org.junit.Test;
 
-import static java.util.Collections.singletonMap;
 import static org.apache.sis.feature.DefaultAssociationRole.NAME_KEY;
 import static org.apache.sis.test.Assert.*;
 
@@ -48,9 +47,9 @@ public final strictfp class CharacteristicTypeMapTest extends TestCase {
      */
     public static DefaultAttributeType<Float> temperature() {
         final DefaultAttributeType<?> units, accuracy;
-        units    = new DefaultAttributeType<>(singletonMap(NAME_KEY, "units"),      String.class, 1, 1, "°C", (DefaultAttributeType[]) null);
-        accuracy = new DefaultAttributeType<>(singletonMap(NAME_KEY, "accuracy"),    Float.class, 1, 1, 0.1f, (DefaultAttributeType[]) null);
-        return     new DefaultAttributeType<>(singletonMap(NAME_KEY, "temperature"), Float.class, 1, 1, null, accuracy, units);
+        units    = new DefaultAttributeType<>(Map.of(NAME_KEY, "units"),      String.class, 1, 1, "°C", (DefaultAttributeType[]) null);
+        accuracy = new DefaultAttributeType<>(Map.of(NAME_KEY, "accuracy"),    Float.class, 1, 1, 0.1f, (DefaultAttributeType[]) null);
+        return     new DefaultAttributeType<>(Map.of(NAME_KEY, "temperature"), Float.class, 1, 1, null, accuracy, units);
     }
 
     /**
@@ -117,10 +116,10 @@ public final strictfp class CharacteristicTypeMapTest extends TestCase {
     @Test
     public void testQualifiedNames() {
         final DefaultAttributeType<?> a1, a2, a3, tp;
-        a1 = new DefaultAttributeType<>(singletonMap(NAME_KEY, Names.parseGenericName(null, null, "ns1:accuracy")), Float.class, 1, 1, 0.1f);
-        a2 = new DefaultAttributeType<>(singletonMap(NAME_KEY, Names.parseGenericName(null, null, "ns2:accuracy")), Float.class, 1, 1, 0.1f);
-        a3 = new DefaultAttributeType<>(singletonMap(NAME_KEY, Names.parseGenericName(null, null, "ns2:s3:units")), String.class, 1, 1, "°C");
-        tp = new DefaultAttributeType<>(singletonMap(NAME_KEY, "temperature"), Float.class, 1, 1, null, a1, a2, a3);
+        a1 = new DefaultAttributeType<>(Map.of(NAME_KEY, Names.parseGenericName(null, null, "ns1:accuracy")), Float.class, 1, 1, 0.1f);
+        a2 = new DefaultAttributeType<>(Map.of(NAME_KEY, Names.parseGenericName(null, null, "ns2:accuracy")), Float.class, 1, 1, 0.1f);
+        a3 = new DefaultAttributeType<>(Map.of(NAME_KEY, Names.parseGenericName(null, null, "ns2:s3:units")), String.class, 1, 1, "°C");
+        tp = new DefaultAttributeType<>(Map.of(NAME_KEY, "temperature"), Float.class, 1, 1, null, a1, a2, a3);
 
         final Map<String, AttributeType<?>> characteristics = tp.characteristics();
         assertSame("ns1:accuracy", a1, characteristics.get("ns1:accuracy"));
diff --git a/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAssociationRoleTest.java b/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAssociationRoleTest.java
index e6032abb79..614b81cfe0 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAssociationRoleTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAssociationRoleTest.java
@@ -26,7 +26,6 @@ import org.apache.sis.test.DependsOn;
 import org.apache.sis.test.TestCase;
 import org.junit.Test;
 
-import static java.util.Collections.singletonMap;
 import static org.apache.sis.feature.DefaultAssociationRole.NAME_KEY;
 import static org.apache.sis.test.TestUtilities.getSingleton;
 import static org.apache.sis.test.Assert.*;
@@ -54,7 +53,7 @@ public final strictfp class DefaultAssociationRoleTest extends TestCase {
      * @return the association to use for testing purpose.
      */
     static DefaultAssociationRole twinTown(final boolean cyclic) {
-        final Map<String,?> properties = singletonMap(NAME_KEY, "twin town");
+        final Map<String,?> properties = Map.of(NAME_KEY, "twin town");
         if (cyclic) {
             final NameFactory factory = DefaultFactories.forBuildin(NameFactory.class);
             final GenericName valueType = factory.createTypeName(null, "Twin town");
@@ -89,7 +88,7 @@ public final strictfp class DefaultAssociationRoleTest extends TestCase {
     private static DefaultFeatureType createType(final Object name,
             final FeatureType parent, final FeatureAssociationRole... property)
     {
-        return new DefaultFeatureType(singletonMap(NAME_KEY, name),
+        return new DefaultFeatureType(Map.of(NAME_KEY, name),
                 false, new FeatureType[] {parent}, property);
     }
 
@@ -156,9 +155,9 @@ public final strictfp class DefaultAssociationRoleTest extends TestCase {
         /*
          * Associations defined only by the FeatureType name.
          */
-        final DefaultAssociationRole toB = new DefaultAssociationRole(singletonMap(NAME_KEY, "toB"), nameOfB, 1, 1);
-        final DefaultAssociationRole toC = new DefaultAssociationRole(singletonMap(NAME_KEY, "toC"), nameOfC, 1, 1);
-        final DefaultAssociationRole toD = new DefaultAssociationRole(singletonMap(NAME_KEY, "toD"), nameOfD, 1, 1);
+        final var toB = new DefaultAssociationRole(Map.of(NAME_KEY, "toB"), nameOfB, 1, 1);
+        final var toC = new DefaultAssociationRole(Map.of(NAME_KEY, "toC"), nameOfC, 1, 1);
+        final var toD = new DefaultAssociationRole(Map.of(NAME_KEY, "toD"), nameOfD, 1, 1);
         final DefaultFeatureType typeA = createType(nameOfA, null, toB);
         final DefaultFeatureType typeB = createType(nameOfB, null, toC);
         final DefaultFeatureType typeC = createType(nameOfC, null, toD);
@@ -166,9 +165,9 @@ public final strictfp class DefaultAssociationRoleTest extends TestCase {
          * Association defined with real FeatureType instance, except for an association to itself.
          * Construction of this FeatureType shall cause the resolution of all above FeatureTypes.
          */
-        final DefaultAssociationRole toAr = new DefaultAssociationRole(singletonMap(NAME_KEY, "toA"),         typeA, 1, 1);
-        final DefaultAssociationRole toBr = new DefaultAssociationRole(singletonMap(NAME_KEY, toB.getName()), typeB, 1, 1);
-        final DefaultAssociationRole toCr = new DefaultAssociationRole(singletonMap(NAME_KEY, toC.getName()), typeC, 1, 1);
+        final var toAr = new DefaultAssociationRole(Map.of(NAME_KEY, "toA"),         typeA, 1, 1);
+        final var toBr = new DefaultAssociationRole(Map.of(NAME_KEY, toB.getName()), typeB, 1, 1);
+        final var toCr = new DefaultAssociationRole(Map.of(NAME_KEY, toC.getName()), typeC, 1, 1);
         final DefaultFeatureType typeD = createType(nameOfD, null, toAr, toBr, toCr, toD);
         /*
          * Verify the property given to the constructors. There is no reason for those properties
diff --git a/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAttributeTypeTest.java b/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAttributeTypeTest.java
index 32e383ca73..0aaec41d8d 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAttributeTypeTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultAttributeTypeTest.java
@@ -26,7 +26,6 @@ import org.apache.sis.test.DependsOnMethod;
 import org.apache.sis.test.TestCase;
 import org.junit.Test;
 
-import static java.util.Collections.singletonMap;
 import static org.apache.sis.test.Assert.*;
 
 
@@ -104,7 +103,7 @@ public final strictfp class DefaultAttributeTypeTest extends TestCase {
      */
     public static DefaultAttributeType<String> universities() {
         return new DefaultAttributeType<>(
-                singletonMap(DefaultAttributeType.NAME_KEY, "universities"),
+                Map.of(DefaultAttributeType.NAME_KEY, "universities"),
                 String.class, 0, Integer.MAX_VALUE, null);
     }
 
@@ -113,7 +112,7 @@ public final strictfp class DefaultAttributeTypeTest extends TestCase {
      * This is the kind of attribute created by the ShapeFile reader.
      */
     static DefaultAttributeType<String> attribute(final String name) {
-        return new DefaultAttributeType<>(singletonMap(DefaultAttributeType.NAME_KEY, name), String.class, 1, 1, null);
+        return new DefaultAttributeType<>(Map.of(DefaultAttributeType.NAME_KEY, name), String.class, 1, 1, null);
     }
 
     /**
diff --git a/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultFeatureTypeTest.java b/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultFeatureTypeTest.java
index d6c30f05b0..ccd058b601 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultFeatureTypeTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/DefaultFeatureTypeTest.java
@@ -30,7 +30,6 @@ import org.junit.Test;
 
 import static org.apache.sis.test.Assert.*;
 import static org.apache.sis.test.TestUtilities.getSingleton;
-import static java.util.Collections.singletonMap;
 
 // Branch-dependent imports
 import org.opengis.feature.PropertyType;
@@ -52,7 +51,7 @@ public final strictfp class DefaultFeatureTypeTest extends TestCase {
      * to be given to {@link AbstractIdentifiedType} constructor.
      */
     private static Map<String,?> name(final Object name) {
-        return singletonMap(AbstractIdentifiedType.NAME_KEY, name);
+        return Map.of(AbstractIdentifiedType.NAME_KEY, name);
     }
 
     /**
diff --git a/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureFormatTest.java b/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureFormatTest.java
index a52e00e809..1d1c9365a2 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureFormatTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureFormatTest.java
@@ -16,7 +16,6 @@
  */
 package org.apache.sis.feature;
 
-import java.util.Collections;
 import java.util.EnumSet;
 import java.util.List;
 import java.util.Locale;
@@ -110,7 +109,7 @@ public final strictfp class FeatureFormatTest extends TestCase {
      * Convenience method returning the given name in a {@code properties} map.
      */
     private static Map<String,?> name(final String name) {
-        return Collections.singletonMap(DefaultFeatureType.NAME_KEY, name);
+        return Map.of(DefaultFeatureType.NAME_KEY, name);
     }
 
     /**
diff --git a/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureMemoryBenchmark.java b/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureMemoryBenchmark.java
index d613565a5f..3112dd90a1 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureMemoryBenchmark.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureMemoryBenchmark.java
@@ -19,12 +19,11 @@ package org.apache.sis.feature;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Random;
 import org.opengis.feature.Feature;
 import org.apache.sis.internal.util.StandardDateFormat;
 
-import static java.util.Collections.singletonMap;
-
 
 /**
  * Compares {@link org.apache.sis.feature} memory usage with a plain {@link HashMap}.
@@ -73,10 +72,10 @@ public final class FeatureMemoryBenchmark {
         features = new ArrayList<>(100000);
         this.isSimple = isSimple;
         if (useSIS) {
-            type = new DefaultFeatureType     (singletonMap("name", "City"), false, null,
-                    new DefaultAttributeType<>(singletonMap("name", "city"),     String.class, 1, 1, null),
-                    new DefaultAttributeType<>(singletonMap("name", "longitude"), Float.class, 1, 1, null),
-                    new DefaultAttributeType<>(singletonMap("name", "latitude"),  Float.class, 1, 1, null));
+            type = new DefaultFeatureType    (Map.of("name", "City"), false, null,
+                   new DefaultAttributeType<>(Map.of("name", "city"),     String.class, 1, 1, null),
+                   new DefaultAttributeType<>(Map.of("name", "longitude"), Float.class, 1, 1, null),
+                   new DefaultAttributeType<>(Map.of("name", "latitude"),  Float.class, 1, 1, null));
         } else {
             type = null;
         }
diff --git a/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureOperationsTest.java b/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureOperationsTest.java
index 612737fc45..ffef9b6a91 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureOperationsTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureOperationsTest.java
@@ -18,7 +18,6 @@ package org.apache.sis.feature;
 
 import java.util.Map;
 import java.util.List;
-import java.util.Collections;
 import com.esri.core.geometry.Point;
 import com.esri.core.geometry.Polygon;
 import org.opengis.geometry.Envelope;
@@ -93,7 +92,7 @@ public final strictfp class FeatureOperationsTest extends TestCase {
      * Creates a map of identification properties containing only an entry for the given name.
      */
     private static Map<String,?> name(final Object name) {
-        return Collections.singletonMap(DefaultAttributeType.NAME_KEY, name);
+        return Map.of(DefaultAttributeType.NAME_KEY, name);
     }
 
     /**
diff --git a/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureTestCase.java b/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureTestCase.java
index 8e69ddf2ff..001bceadb6 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureTestCase.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/FeatureTestCase.java
@@ -16,9 +16,9 @@
  */
 package org.apache.sis.feature;
 
+import java.util.Map;
 import java.util.List;
 import java.util.Collection;
-import java.util.Collections;
 import org.opengis.metadata.quality.DataQuality;
 import org.opengis.metadata.quality.Element;
 import org.opengis.metadata.quality.Result;
@@ -152,7 +152,7 @@ public abstract strictfp class FeatureTestCase extends TestCase {
     @Test
     public void testGetProperty() {
         final DefaultFeatureType type = new DefaultFeatureType(
-                Collections.singletonMap(DefaultFeatureType.NAME_KEY, "My shapefile"), false, null,
+                Map.of(DefaultFeatureType.NAME_KEY, "My shapefile"), false, null,
                 DefaultAttributeTypeTest.attribute("COMMUNE"),
                 DefaultAttributeTypeTest.attribute("REF_INSEE"),
                 DefaultAttributeTypeTest.attribute("CODE_POSTAL"));
@@ -253,7 +253,7 @@ public abstract strictfp class FeatureTestCase extends TestCase {
          */
         assertEquals("universities", List.of(), getAttributeValue("universities"));
         feature.setPropertyValue("universities", "University of arts");
-        assertEquals("universities", Collections.singletonList("University of arts"), getAttributeValue("universities"));
+        assertEquals("universities", List.of("University of arts"), getAttributeValue("universities"));
         /*
          * Switch to 'getProperty' mode only after we have set at least one value,
          * in order to test the conversion of existing values to property instances.
@@ -349,7 +349,7 @@ public abstract strictfp class FeatureTestCase extends TestCase {
     @DependsOnMethod("testSimpleProperties")
     public void testAddToCollection() {
         feature = createFeature(new DefaultFeatureType(
-                Collections.singletonMap(DefaultFeatureType.NAME_KEY, "City"),
+                Map.of(DefaultFeatureType.NAME_KEY, "City"),
                 false, null, DefaultAttributeTypeTest.universities()));
         /*
          * The value below is an instance of Collection<String>.
diff --git a/core/sis-feature/src/test/java/org/apache/sis/feature/LinkOperationTest.java b/core/sis-feature/src/test/java/org/apache/sis/feature/LinkOperationTest.java
index 3e436da84d..a49cc17f31 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/LinkOperationTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/LinkOperationTest.java
@@ -16,12 +16,12 @@
  */
 package org.apache.sis.feature;
 
+import java.util.Map;
 import org.apache.sis.test.DependsOn;
 import org.apache.sis.test.TestCase;
 import org.junit.Test;
 
 import static org.junit.Assert.*;
-import static java.util.Collections.singletonMap;
 
 
 /**
@@ -51,9 +51,9 @@ public final strictfp class LinkOperationTest extends TestCase {
      */
     private static DefaultFeatureType city() {
         final DefaultFeatureType city = DefaultFeatureTypeTest.city();
-        final LinkOperation link = new LinkOperation(singletonMap(DefaultFeatureType.NAME_KEY, "name"),
+        final LinkOperation link = new LinkOperation(Map.of(DefaultFeatureType.NAME_KEY, "name"),
                 city.getProperty("city"));
-        return new DefaultFeatureType(singletonMap(DefaultFeatureType.NAME_KEY, "Metropolis"),
+        return new DefaultFeatureType(Map.of(DefaultFeatureType.NAME_KEY, "Metropolis"),
                 false, new DefaultFeatureType[] {city}, link);
     }
 
diff --git a/core/sis-feature/src/test/java/org/apache/sis/feature/PropertySingletonTest.java b/core/sis-feature/src/test/java/org/apache/sis/feature/PropertySingletonTest.java
index e3e34285d1..324a2a1a85 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/PropertySingletonTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/PropertySingletonTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.feature;
 
+import java.util.Map;
 import java.util.Set;
 import org.apache.sis.test.DependsOnMethod;
 import org.apache.sis.test.TestCase;
@@ -23,7 +24,6 @@ import org.junit.Test;
 
 import static org.junit.Assert.*;
 import static java.util.Collections.singleton;
-import static java.util.Collections.singletonMap;
 import static org.apache.sis.test.TestUtilities.getSingleton;
 
 
@@ -51,7 +51,8 @@ public final strictfp class PropertySingletonTest extends TestCase {
      */
     public PropertySingletonTest() {
         attribute = new SingletonAttribute<>(new DefaultAttributeType<>(
-                singletonMap(DefaultAttributeType.NAME_KEY, "test"), Integer.class, 0, 1, null));
+                        Map.of(DefaultAttributeType.NAME_KEY, "test"),
+                        Integer.class, 0, 1, null));
         singleton = new PropertySingleton<>(attribute);
     }
 
diff --git a/core/sis-feature/src/test/java/org/apache/sis/feature/SingletonAssociationTest.java b/core/sis-feature/src/test/java/org/apache/sis/feature/SingletonAssociationTest.java
index 179584bdac..c5fdd6cc7d 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/SingletonAssociationTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/SingletonAssociationTest.java
@@ -16,17 +16,13 @@
  */
 package org.apache.sis.feature;
 
+import java.util.Map;
 import org.apache.sis.test.DependsOn;
 import org.apache.sis.test.TestCase;
 import org.junit.Test;
 
-import static java.util.Collections.singletonMap;
 import static org.apache.sis.test.Assert.*;
 
-// Branch-dependent imports
-import org.opengis.feature.Feature;
-import org.opengis.feature.PropertyType;
-
 
 /**
  * Tests {@link SingletonAssociation}.
@@ -48,10 +44,10 @@ public final strictfp class SingletonAssociationTest extends TestCase {
      * and Le Mans, France in 836.” — source: Wikipedia</blockquote>
      */
     static AbstractAssociation twinTown() {
-        final Feature twinTown = DefaultFeatureTypeTest.city().newInstance();
+        final var twinTown = DefaultFeatureTypeTest.city().newInstance();
         twinTown.setPropertyValue("city", "Le Mans");
-        twinTown.setPropertyValue("population", 143240); // In 2011.
-        final AbstractAssociation association = new SingletonAssociation(DefaultAssociationRoleTest.twinTown(false));
+        twinTown.setPropertyValue("population", 143240);        // In 2011.
+        final var association = new SingletonAssociation(DefaultAssociationRoleTest.twinTown(false));
         association.setValue(twinTown);
         return association;
     }
@@ -61,10 +57,9 @@ public final strictfp class SingletonAssociationTest extends TestCase {
      */
     @Test
     public void testWrongValue() {
-        final AbstractAssociation association  = twinTown();
-        final PropertyType population   = association.getRole().getValueType().getProperty("population");
-        final Feature      otherFeature = new DefaultFeatureType(
-                singletonMap(DefaultFeatureType.NAME_KEY, "Population"), false, null, population).newInstance();
+        final var association  = twinTown();
+        final var population   = association.getRole().getValueType().getProperty("population");
+        final var otherFeature = new DefaultFeatureType(Map.of(DefaultFeatureType.NAME_KEY, "Population"), false, null, population).newInstance();
         try {
             association.setValue(otherFeature);
         } catch (IllegalArgumentException e) {
diff --git a/core/sis-feature/src/test/java/org/apache/sis/feature/StringJoinOperationTest.java b/core/sis-feature/src/test/java/org/apache/sis/feature/StringJoinOperationTest.java
index 453c72882d..894a818565 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/StringJoinOperationTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/StringJoinOperationTest.java
@@ -16,7 +16,6 @@
  */
 package org.apache.sis.feature;
 
-import java.util.Collections;
 import java.util.Map;
 import org.junit.Test;
 import org.apache.sis.internal.feature.AttributeConvention;
@@ -71,7 +70,7 @@ public final strictfp class StringJoinOperationTest extends TestCase {
      * Creates the identification map to be given to attribute, operation and feature constructors.
      */
     private static Map<String,?> name(final Object name) {
-        return Collections.singletonMap(AbstractIdentifiedType.NAME_KEY, name);
+        return Map.of(AbstractIdentifiedType.NAME_KEY, name);
     }
 
     /**
diff --git a/core/sis-feature/src/test/java/org/apache/sis/feature/builder/FeatureTypeBuilderTest.java b/core/sis-feature/src/test/java/org/apache/sis/feature/builder/FeatureTypeBuilderTest.java
index 32aeda43e9..a6a8b8b5bf 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/feature/builder/FeatureTypeBuilderTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/feature/builder/FeatureTypeBuilderTest.java
@@ -16,8 +16,8 @@
  */
 package org.apache.sis.feature.builder;
 
+import java.util.Map;
 import java.util.Iterator;
-import java.util.Collections;
 import com.esri.core.geometry.Geometry;
 import com.esri.core.geometry.Point;
 import org.opengis.geometry.Envelope;
@@ -375,7 +375,7 @@ public final strictfp class FeatureTypeBuilderTest extends TestCase {
         final FeatureType parentType = builder.build();
 
         builder = new FeatureTypeBuilder().setName("Child").setSuperTypes(parentType);
-        builder.addProperty(FeatureOperations.link(Collections.singletonMap(AbstractOperation.NAME_KEY, "B"), pa));
+        builder.addProperty(FeatureOperations.link(Map.of(AbstractOperation.NAME_KEY, "B"), pa));
         final FeatureType childType = builder.build();
 
         final Iterator<? extends PropertyType> it = childType.getProperties(true).iterator();
diff --git a/core/sis-feature/src/test/java/org/apache/sis/internal/feature/AttributeConventionTest.java b/core/sis-feature/src/test/java/org/apache/sis/internal/feature/AttributeConventionTest.java
index 22423e24ca..a13bd75df7 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/internal/feature/AttributeConventionTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/internal/feature/AttributeConventionTest.java
@@ -17,7 +17,6 @@
 package org.apache.sis.internal.feature;
 
 import java.util.Map;
-import java.util.Collections;
 import com.esri.core.geometry.Point;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.apache.sis.referencing.crs.HardCodedCRS;
@@ -61,7 +60,7 @@ public final strictfp class AttributeConventionTest extends TestCase {
      */
     @Test
     public void testIsGeometryAttribute() {
-        final Map<String,?> properties = Collections.singletonMap(DefaultAttributeType.NAME_KEY, "geometry");
+        final Map<String,?> properties = Map.of(DefaultAttributeType.NAME_KEY, "geometry");
 
         assertFalse("AttributeType<Integer>", AttributeConvention.isGeometryAttribute(
                 new DefaultAttributeType<>(properties, Integer.class, 1, 1, null)));
@@ -76,7 +75,7 @@ public final strictfp class AttributeConventionTest extends TestCase {
      */
     @Test
     public void testGetCrsCharacteristic() {
-        final Map<String,?> properties = Collections.singletonMap(DefaultAttributeType.NAME_KEY, "geometry");
+        final Map<String,?> properties = Map.of(DefaultAttributeType.NAME_KEY, "geometry");
         DefaultAttributeType<Point> type = new DefaultAttributeType<>(properties, Point.class, 1, 1, null);
         assertFalse("characterizedByCRS",  AttributeConvention.characterizedByCRS(type));
         assertNull("getCRSCharacteristic", AttributeConvention.getCRSCharacteristic(type.newInstance()));
@@ -85,7 +84,7 @@ public final strictfp class AttributeConventionTest extends TestCase {
          * the Coordinate Reference System of the "geometry" attribute. Then test again.
          */
         final DefaultAttributeType<CoordinateReferenceSystem> characteristic = new DefaultAttributeType<>(
-                Collections.singletonMap(DefaultAttributeType.NAME_KEY, AttributeConvention.CRS_CHARACTERISTIC),
+                Map.of(DefaultAttributeType.NAME_KEY, AttributeConvention.CRS_CHARACTERISTIC),
                 CoordinateReferenceSystem.class, 1, 1, HardCodedCRS.WGS84);
 
         type = new DefaultAttributeType<>(properties, Point.class, 1, 1, null, characteristic);
@@ -95,10 +94,10 @@ public final strictfp class AttributeConventionTest extends TestCase {
         /*
          * Test again AttributeConvention.getCRSCharacteristic(…, PropertyType), but following link.
          */
-        final Operation link = FeatureOperations.link(Collections.singletonMap(DefaultAttributeType.NAME_KEY, "geom"), type);
-        final DefaultFeatureType feat = new DefaultFeatureType(Collections.singletonMap(DefaultAttributeType.NAME_KEY, "feat"), false, null, type, link);
-        assertEquals(HardCodedCRS.WGS84, AttributeConvention.getCRSCharacteristic(feat, link));
-        assertNull(                      AttributeConvention.getCRSCharacteristic(null, link));
+        final Operation link = FeatureOperations.link(Map.of(DefaultAttributeType.NAME_KEY, "geom"), type);
+        final var feature = new DefaultFeatureType(Map.of(DefaultAttributeType.NAME_KEY, "feat"), false, null, type, link);
+        assertEquals(HardCodedCRS.WGS84, AttributeConvention.getCRSCharacteristic(feature, link));
+        assertNull(AttributeConvention.getCRSCharacteristic(null, link));
     }
 
     /**
@@ -107,7 +106,7 @@ public final strictfp class AttributeConventionTest extends TestCase {
      */
     @Test
     public void testGetMaximalLengthCharacteristic() {
-        final Map<String,?> properties = Collections.singletonMap(DefaultAttributeType.NAME_KEY, "name");
+        final Map<String,?> properties = Map.of(DefaultAttributeType.NAME_KEY, "name");
         DefaultAttributeType<String> type = new DefaultAttributeType<>(properties, String.class, 1, 1, null);
         assertFalse("characterizedByMaximalLength",  AttributeConvention.characterizedByMaximalLength(type));
         assertNull("getMaximalLengthCharacteristic", AttributeConvention.getMaximalLengthCharacteristic(type.newInstance()));
@@ -116,7 +115,7 @@ public final strictfp class AttributeConventionTest extends TestCase {
          * the maximal length of the "name" attribute. Then test again.
          */
         final DefaultAttributeType<Integer> characteristic = new DefaultAttributeType<>(
-                Collections.singletonMap(DefaultAttributeType.NAME_KEY, AttributeConvention.MAXIMAL_LENGTH_CHARACTERISTIC),
+                Map.of(DefaultAttributeType.NAME_KEY, AttributeConvention.MAXIMAL_LENGTH_CHARACTERISTIC),
                 Integer.class, 1, 1, 120);
 
         type = new DefaultAttributeType<>(properties, String.class, 1, 1, null, characteristic);
diff --git a/core/sis-feature/src/test/java/org/apache/sis/internal/feature/jts/JTSTest.java b/core/sis-feature/src/test/java/org/apache/sis/internal/feature/jts/JTSTest.java
index 921b871213..03b24de83c 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/internal/feature/jts/JTSTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/internal/feature/jts/JTSTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.internal.feature.jts;
 
-import java.util.Collections;
+import java.util.Map;
 import org.opengis.geometry.MismatchedDimensionException;
 import org.opengis.util.FactoryException;
 import org.opengis.referencing.operation.TransformException;
@@ -66,7 +66,7 @@ public final strictfp class JTSTest extends TestCase {
         /*
          * Test CRS as map value.
          */
-        geometry.setUserData(Collections.singletonMap(JTS.CRS_KEY, CommonCRS.NAD83.geographic()));
+        geometry.setUserData(Map.of(JTS.CRS_KEY, CommonCRS.NAD83.geographic()));
         assertEquals(CommonCRS.NAD83.geographic(), JTS.getCoordinateReferenceSystem(geometry));
         /*
          * Test CRS as srid.
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/TypeRegistration.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/TypeRegistration.java
index a672be9215..e67e9234c3 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/TypeRegistration.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/TypeRegistration.java
@@ -21,7 +21,6 @@ import java.util.Map;
 import java.util.HashMap;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.ServiceLoader;
 import java.util.concurrent.TimeUnit;
 import java.util.function.UnaryOperator;
@@ -249,7 +248,7 @@ public abstract class TypeRegistration {
             }
         }
         if (properties == null) {
-            return Collections.singletonMap(ROOT_ADAPTERS, c);
+            return Map.of(ROOT_ADAPTERS, c);
         }
         final Map<String,Object> copy = new HashMap<>(properties);
         copy.put(ROOT_ADAPTERS, c);
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/RecordSchemaSIS.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/RecordSchemaSIS.java
index edf4a8c5cc..715f7f869f 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/RecordSchemaSIS.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/RecordSchemaSIS.java
@@ -16,9 +16,9 @@
  */
 package org.apache.sis.internal.metadata;
 
+import java.util.Map;
 import java.io.Serializable;
 import java.io.ObjectStreamException;
-import java.util.Collections;
 import org.opengis.util.TypeName;
 import org.opengis.util.InternationalString;
 import org.apache.sis.internal.util.Constants;
@@ -83,8 +83,7 @@ public final class RecordSchemaSIS extends DefaultRecordSchema implements Serial
      * @return a record type of the given name and field.
      */
     private static DefaultRecordType singleton(final short typeName, final InternationalString field, final Class<?> valueClass) {
-        return (DefaultRecordType) INSTANCE.createRecordType(
-                Resources.formatInternational(typeName), Collections.singletonMap(field, valueClass));
+        return (DefaultRecordType) INSTANCE.createRecordType(Resources.formatInternational(typeName), Map.of(field, valueClass));
     }
 
     /**
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/Names.java b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/Names.java
index 7429297cbe..60c18743a8 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/util/iso/Names.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/util/iso/Names.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.util.iso;
 
-import java.util.Collections;
+import java.util.Map;
 import java.lang.reflect.Type;
 import org.opengis.util.TypeName;
 import org.opengis.util.LocalName;
@@ -112,7 +112,7 @@ public final class Names extends Static {
             return null;
         }
         return factory.createNameSpace(factory.createLocalName(null, namespace),
-                (separator == null) ? null : Collections.singletonMap("separator.head", separator));
+                (separator == null) ? null : Map.of("separator.head", separator));
     }
 
     /**
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/xml/XML.java b/core/sis-metadata/src/main/java/org/apache/sis/xml/XML.java
index 204af20a66..85334b19a5 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/xml/XML.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/xml/XML.java
@@ -19,7 +19,6 @@ package org.apache.sis.xml;
 import java.util.Map;
 import java.util.Locale;
 import java.util.TimeZone;
-import java.util.Collections;
 import java.util.logging.Filter;
 import java.util.logging.LogRecord;             // For javadoc
 import java.net.URL;
@@ -419,7 +418,7 @@ public final class XML extends Static {
             synchronized (XML.class) {
                 pool = POOL;                            // Double-check idiom: see javadoc.
                 if (pool == null) {
-                    POOL = pool = new MarshallerPool(Collections.singletonMap(LENIENT_UNMARSHAL, Boolean.TRUE));
+                    POOL = pool = new MarshallerPool(Map.of(LENIENT_UNMARSHAL, Boolean.TRUE));
                 }
             }
         }
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/internal/jaxb/cat/CodeListMarshallingTest.java b/core/sis-metadata/src/test/java/org/apache/sis/internal/jaxb/cat/CodeListMarshallingTest.java
index 2aab8902ed..1adea5d3fd 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/internal/jaxb/cat/CodeListMarshallingTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/internal/jaxb/cat/CodeListMarshallingTest.java
@@ -16,9 +16,9 @@
  */
 package org.apache.sis.internal.jaxb.cat;
 
+import java.util.Map;
 import java.util.List;
 import java.util.Locale;
-import java.util.Collections;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.JAXBException;
 import org.opengis.metadata.citation.Role;
@@ -127,7 +127,7 @@ public final strictfp class CodeListMarshallingTest extends TestCase {
         final MarshallerPool pool = getMarshallerPool();
         final Marshaller marshaller = pool.acquireMarshaller();
         marshaller.setProperty(XML.METADATA_VERSION, VERSION_2007);
-        marshaller.setProperty(XML.SCHEMAS, Collections.singletonMap("gmd",
+        marshaller.setProperty(XML.SCHEMAS, Map.of("gmd",
                 "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas"));     // Intentionally omit trailing '/'.
         final String actual = marshal(marshaller, rp);
         pool.recycle(marshaller);
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/internal/jaxb/gco/MultiplicityTest.java b/core/sis-metadata/src/test/java/org/apache/sis/internal/jaxb/gco/MultiplicityTest.java
index da28840892..4e0ddfb965 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/internal/jaxb/gco/MultiplicityTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/internal/jaxb/gco/MultiplicityTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.internal.jaxb.gco;
 
-import java.util.Collections;
+import java.util.Map;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
 import org.apache.sis.util.Version;
@@ -63,7 +63,7 @@ public final strictfp class MultiplicityTest extends TestUsingFile {
     protected MarshallerPool getMarshallerPool() throws JAXBException {
         if (pool == null) {
             pool = new MarshallerPool(JAXBContext.newInstance(FeatureAttributeMock.class),
-                        Collections.singletonMap(XML.LENIENT_UNMARSHAL, Boolean.TRUE));
+                                      Map.of(XML.LENIENT_UNMARSHAL, Boolean.TRUE));
         }
         return pool;
     }
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/MergerTest.java b/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/MergerTest.java
index b5cc133401..5a669bd235 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/MergerTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/MergerTest.java
@@ -16,11 +16,11 @@
  */
 package org.apache.sis.internal.metadata;
 
+import java.util.Map;
 import java.util.Set;
 import java.util.List;
 import java.util.Locale;
 import java.util.Iterator;
-import java.util.Collections;
 import java.nio.charset.StandardCharsets;
 import org.opengis.metadata.citation.Citation;
 import org.opengis.metadata.content.ContentInformation;
@@ -68,7 +68,7 @@ public final strictfp class MergerTest extends TestCase {
         image.setCloudCoverPercentage(0.8);
         metadata.getContentInfo().add(image);
 
-        metadata.setLocalesAndCharsets(Collections.singletonMap(Locale.JAPANESE, StandardCharsets.UTF_16));
+        metadata.setLocalesAndCharsets(Map.of(Locale.JAPANESE, StandardCharsets.UTF_16));
         return metadata;
     }
 
@@ -87,7 +87,7 @@ public final strictfp class MergerTest extends TestCase {
         features.setIncludedWithDataset(Boolean.TRUE);
         metadata.getContentInfo().add(features);
 
-        metadata.setLocalesAndCharsets(Collections.singletonMap(Locale.FRENCH, StandardCharsets.UTF_8));
+        metadata.setLocalesAndCharsets(Map.of(Locale.FRENCH, StandardCharsets.UTF_8));
         return metadata;
     }
 
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultBrowseGraphicTest.java b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultBrowseGraphicTest.java
index 16887f1248..9637c9491f 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultBrowseGraphicTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/identification/DefaultBrowseGraphicTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.metadata.iso.identification;
 
+import java.util.Map;
 import java.net.URI;
 import java.io.StringReader;
 import java.util.logging.Filter;
@@ -33,7 +34,6 @@ import org.apache.sis.test.DependsOnMethod;
 import org.junit.Test;
 
 import static java.util.logging.Logger.getLogger;
-import static java.util.Collections.singletonMap;
 import static org.apache.sis.test.MetadataAssert.*;
 
 
@@ -317,8 +317,9 @@ public final strictfp class DefaultBrowseGraphicTest extends TestCase {
          * Unmarshals the given object while listening to warnings.
          */
         public DefaultBrowseGraphic unmarshal(final String xml) throws JAXBException {
-            return (DefaultBrowseGraphic) XML.unmarshal(new StreamSource(new StringReader(xml)),
-                    singletonMap(XML.WARNING_FILTER, this));
+            return (DefaultBrowseGraphic) XML.unmarshal(
+                    new StreamSource(new StringReader(xml)),
+                    Map.of(XML.WARNING_FILTER, this));
         }
     }
 }
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/quality/DefaultQuantitativeResultTest.java b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/quality/DefaultQuantitativeResultTest.java
index 78f21b9fbd..dbe19dc7e4 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/quality/DefaultQuantitativeResultTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/metadata/iso/quality/DefaultQuantitativeResultTest.java
@@ -17,8 +17,9 @@
 package org.apache.sis.metadata.iso.quality;
 
 import java.util.Map;
+import java.util.Set;
+import java.util.List;
 import java.util.Iterator;
-import java.util.Collections;
 import javax.xml.bind.JAXBException;
 import org.opengis.util.Type;
 import org.opengis.util.RecordType;
@@ -84,7 +85,7 @@ public final strictfp class DefaultQuantitativeResultTest extends TestCase {
          */
         final RecordType recordType = RecordSchemaSIS.INSTANCE.createRecordType(
                 RecordSchemaSIS.MULTILINE.toInternationalString(),
-                Collections.singletonMap("Result of quality measurement", String.class));
+                Map.of("Result of quality measurement", String.class));
         /*
          * The `Record` constructor invoked at unmarshalling time sets the type
          * to the hard-coded "Single text" value. We need to use the same type.
@@ -98,14 +99,14 @@ public final strictfp class DefaultQuantitativeResultTest extends TestCase {
          */
         assertNotEquals(recordType, record.getRecordType());        // Actually a limitation, not an intended behavior.
         final DefaultQuantitativeResult result = new DefaultQuantitativeResult();
-        result.setValues(Collections.singletonList(record));
+        result.setValues(List.of(record));
         result.setValueType(recordType);
         /*
          * Opportunistically test the redirection implemented in deprecated methods.
          */
         final DefaultQuantitativeAttributeAccuracy element = new DefaultQuantitativeAttributeAccuracy();
-        element.setNamesOfMeasure(Collections.singleton(new SimpleInternationalString("Some quality flag")));
-        element.setResults(Collections.singleton(result));
+        element.setNamesOfMeasure(Set.of(new SimpleInternationalString("Some quality flag")));
+        element.setResults(Set.of(result));
         return element;
     }
 
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/util/iso/DefaultRecordTypeTest.java b/core/sis-metadata/src/test/java/org/apache/sis/util/iso/DefaultRecordTypeTest.java
index ee2f9062af..077c64b768 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/util/iso/DefaultRecordTypeTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/util/iso/DefaultRecordTypeTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.util.iso;
 
-import java.util.Collections;
+import java.util.Map;
 import org.opengis.util.Type;
 import org.opengis.util.MemberName;
 import org.opengis.util.NameSpace;
@@ -69,7 +69,7 @@ public final strictfp class DefaultRecordTypeTest extends TestCase {
      */
     private DefaultRecordType create() throws IllegalArgumentException {
         final Type fieldType = new SimpleAttributeType<>(fieldTypeName, Integer.class);
-        return new DefaultRecordType(recordTypeName, container, Collections.singletonMap(fieldName, fieldType));
+        return new DefaultRecordType(recordTypeName, container, Map.of(fieldName, fieldType));
     }
 
     /**
diff --git a/core/sis-metadata/src/test/java/org/apache/sis/util/iso/NameMarshallingTest.java b/core/sis-metadata/src/test/java/org/apache/sis/util/iso/NameMarshallingTest.java
index 3e24ddf22d..c06732f8f8 100644
--- a/core/sis-metadata/src/test/java/org/apache/sis/util/iso/NameMarshallingTest.java
+++ b/core/sis-metadata/src/test/java/org/apache/sis/util/iso/NameMarshallingTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.util.iso;
 
-import java.util.Collections;
+import java.util.Map;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
 import javax.xml.bind.JAXBContext;
@@ -66,7 +66,7 @@ public final strictfp class NameMarshallingTest extends TestCase {
     private String marshal(final GenericName name) throws JAXBException {
         if (pool == null) {
             pool = new MarshallerPool(JAXBContext.newInstance(IdentifiedObjectMock.class),
-                    Collections.singletonMap(XML.LENIENT_UNMARSHAL, Boolean.TRUE));
+                                      Map.of(XML.LENIENT_UNMARSHAL, Boolean.TRUE));
         }
         final Marshaller marshaller = pool.acquireMarshaller();
         marshaller.setProperty(XML.METADATA_VERSION, VERSION_2007);
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_OperationMethod.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_OperationMethod.java
index 4c85779a3d..3fd0a9817d 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_OperationMethod.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/CC_OperationMethod.java
@@ -18,7 +18,6 @@ package org.apache.sis.internal.jaxb.referencing;
 
 import java.util.Map;
 import java.util.Collection;
-import java.util.Collections;
 import javax.xml.bind.annotation.XmlElement;
 import javax.measure.Unit;
 import org.opengis.util.FactoryException;
@@ -180,7 +179,7 @@ public final class CC_OperationMethod extends PropertyType<CC_OperationMethod, O
             Context.warningOccured(Context.current(), DefaultOperationMethod.class, "setDescriptors", e, true);
             method = null;
         }
-        final Map<String,?> properties = Collections.singletonMap(ParameterDescriptorGroup.NAME_KEY, name);
+        final Map<String,?> properties = Map.of(ParameterDescriptorGroup.NAME_KEY, name);
         if (method != null) {
             /*
              * Verify that the predefined operation method contains at least all the parameters specified by
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/GeodeticObjectBuilder.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/GeodeticObjectBuilder.java
index afec836244..f851379ffb 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/GeodeticObjectBuilder.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/GeodeticObjectBuilder.java
@@ -18,7 +18,6 @@ package org.apache.sis.internal.referencing;
 
 import java.util.Map;
 import java.util.Date;
-import java.util.Collections;
 import java.util.Locale;
 import java.util.function.BiConsumer;
 import javax.measure.Unit;
@@ -140,7 +139,7 @@ public class GeodeticObjectBuilder extends Builder<GeodeticObjectBuilder> {
      * Creates a map of properties containing only the name of the given object.
      */
     private static Map<String,Object> name(final IdentifiedObject template) {
-        return Collections.singletonMap(IdentifiedObject.NAME_KEY, template.getName());
+        return Map.of(IdentifiedObject.NAME_KEY, template.getName());
     }
 
     /**
@@ -205,7 +204,7 @@ public class GeodeticObjectBuilder extends Builder<GeodeticObjectBuilder> {
     {
         final DatumFactory factory = factories.getDatumFactory();
         final Ellipsoid ellipsoid = factory.createFlattenedSphere(
-                Collections.singletonMap(Ellipsoid.NAME_KEY, name), semiMajorAxis, inverseFlattening, units);
+                Map.of(Ellipsoid.NAME_KEY, name), semiMajorAxis, inverseFlattening, units);
         datum = factory.createGeodeticDatum(name(ellipsoid), ellipsoid, CommonCRS.WGS84.primeMeridian());
         return this;
     }
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Legacy.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Legacy.java
index 24ef9891eb..914dccf316 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Legacy.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Legacy.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.internal.referencing;
 
+import java.util.Map;
 import javax.measure.Unit;
 import javax.measure.quantity.Length;
 import org.opengis.referencing.cs.AxisDirection;
@@ -27,7 +28,6 @@ import org.apache.sis.referencing.cs.CoordinateSystems;
 import org.apache.sis.referencing.cs.DefaultCartesianCS;
 import org.apache.sis.referencing.cs.DefaultCoordinateSystemAxis;
 
-import static java.util.Collections.singletonMap;
 import static org.opengis.referencing.IdentifiedObject.NAME_KEY;
 
 
@@ -56,10 +56,10 @@ public final class Legacy {
      * the ISO 19111's ones (ISO names are "Geocentric X", "Geocentric Y" and "Geocentric Z"). This constant uses
      * the invalid names and directions for WKT 1 parsing/formatting purposes.
      */
-    private static final CartesianCS LEGACY = new DefaultCartesianCS(singletonMap(NAME_KEY, "Legacy geocentric"),
-            new DefaultCoordinateSystemAxis(singletonMap(NAME_KEY, "X"), "X", AxisDirection.OTHER, Units.METRE),
-            new DefaultCoordinateSystemAxis(singletonMap(NAME_KEY, "Y"), "Y", AxisDirection.EAST,  Units.METRE),
-            new DefaultCoordinateSystemAxis(singletonMap(NAME_KEY, "Z"), "Z", AxisDirection.NORTH, Units.METRE));
+    private static final CartesianCS LEGACY = new DefaultCartesianCS(Map.of(NAME_KEY, "Legacy geocentric"),
+            new DefaultCoordinateSystemAxis(Map.of(NAME_KEY, "X"), "X", AxisDirection.OTHER, Units.METRE),
+            new DefaultCoordinateSystemAxis(Map.of(NAME_KEY, "Y"), "Y", AxisDirection.EAST,  Units.METRE),
+            new DefaultCoordinateSystemAxis(Map.of(NAME_KEY, "Z"), "Z", AxisDirection.NORTH, Units.METRE));
 
     /**
      * Do not allow instantiation of this class.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ReferencingUtilities.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ReferencingUtilities.java
index bcb57f4e26..169dea56ef 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ReferencingUtilities.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ReferencingUtilities.java
@@ -56,8 +56,6 @@ import org.apache.sis.referencing.cs.DefaultEllipsoidalCS;
 import org.apache.sis.referencing.operation.transform.DefaultMathTransformFactory;
 import org.apache.sis.referencing.operation.transform.DefaultMathTransformFactory.Context;
 
-import static java.util.Collections.singletonMap;
-
 
 /**
  * A set of static methods working on GeoAPI referencing objects.
@@ -387,7 +385,7 @@ public final class ReferencingUtilities extends Static {
                 return (GeographicCRS) crs;
             }
             return new DefaultGeographicCRS(
-                    singletonMap(DefaultGeographicCRS.NAME_KEY, NilReferencingObject.UNNAMED),
+                    Map.of(DefaultGeographicCRS.NAME_KEY, NilReferencingObject.UNNAMED),
                     ((GeodeticCRS) crs).getDatum(), normalizedCS);
         }
         if (crs instanceof CompoundCRS) {
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/Affine.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/Affine.java
index c09e855dd0..50d6789271 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/Affine.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/Affine.java
@@ -18,7 +18,6 @@ package org.apache.sis.internal.referencing.provider;
 
 import java.util.Map;
 import java.util.Arrays;
-import java.util.Collections;
 import javax.xml.bind.annotation.XmlTransient;
 import org.opengis.parameter.ParameterValueGroup;
 import org.opengis.parameter.ParameterDescriptor;
@@ -110,7 +109,7 @@ public final class Affine extends AbstractProvider {
     private static final Map<String,?> IDENTIFICATION_EPSG, IDENTIFICATION_OGC;
     static {
         final NamedIdentifier nameOGC = new NamedIdentifier(Citations.OGC, Constants.OGC, Constants.AFFINE, null, null);
-        IDENTIFICATION_OGC = Collections.singletonMap(NAME_KEY, nameOGC);
+        IDENTIFICATION_OGC  = Map.of(NAME_KEY, nameOGC);
         IDENTIFICATION_EPSG = EPSGName.properties(9624, NAME, nameOGC);
     }
 
@@ -295,8 +294,7 @@ public final class Affine extends AbstractProvider {
      * @since 0.8
      */
     public static ParameterValueGroup identity(int dimension) {
-        final ParameterValueGroup values = TensorParameters.WKT1.createValueGroup(
-                Collections.singletonMap(NAME_KEY, Constants.AFFINE));
+        final var values = TensorParameters.WKT1.createValueGroup(Map.of(NAME_KEY, Constants.AFFINE));
         values.parameter(Constants.NUM_COL).setValue(++dimension);
         values.parameter(Constants.NUM_ROW).setValue(  dimension);
         return values;
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/FranceGeocentricInterpolation.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/FranceGeocentricInterpolation.java
index 094f8c7b40..314db32475 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/FranceGeocentricInterpolation.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/FranceGeocentricInterpolation.java
@@ -16,8 +16,8 @@
  */
 package org.apache.sis.internal.referencing.provider;
 
+import java.util.Map;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.Locale;
 import java.util.NoSuchElementException;
 import java.util.StringTokenizer;
@@ -298,8 +298,8 @@ public class FranceGeocentricInterpolation extends GeodeticOperation {
         {
             return candidate;
         }
-        return DefaultEllipsoid.createEllipsoid(Collections.singletonMap(Ellipsoid.NAME_KEY,
-                NilReferencingObject.UNNAMED), semiMajorAxis, semiMinorAxis, Units.METRE);
+        return DefaultEllipsoid.createEllipsoid(Map.of(Ellipsoid.NAME_KEY, NilReferencingObject.UNNAMED),
+                                                semiMajorAxis, semiMinorAxis, Units.METRE);
     }
 
     /**
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/Molodensky.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/Molodensky.java
index 77291aeddc..b770dc0ebd 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/Molodensky.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/Molodensky.java
@@ -17,7 +17,6 @@
 package org.apache.sis.internal.referencing.provider;
 
 import java.util.Map;
-import java.util.Collections;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.measure.Unit;
 import org.opengis.util.FactoryException;
@@ -234,7 +233,7 @@ public final class Molodensky extends GeocentricAffineBetweenGeographic {
         if (Double.isNaN(tb)) {
             tb = ta*(sb/sa - Δf);
         }
-        final Map<String,?> name = Collections.singletonMap(DefaultEllipsoid.NAME_KEY, NilReferencingObject.UNNAMED);
+        final Map<String,?> name = Map.of(DefaultEllipsoid.NAME_KEY, NilReferencingObject.UNNAMED);
         final Ellipsoid source = new Ellipsoid(name, sa, sb,  Δa,  Δf);
         final Ellipsoid target = new Ellipsoid(name, ta, tb, -Δa, -Δf);
         source.other = target;
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/GeodeticObjectParser.java b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/GeodeticObjectParser.java
index 5e7d134fb7..1dc23fec11 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/GeodeticObjectParser.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/GeodeticObjectParser.java
@@ -905,7 +905,7 @@ class GeodeticObjectParser extends MathTransformParser implements Comparator<Coo
             name = AxisDirections.appendTo(buffer.append("CS"), axes);
         }
         if (csProperties == null) {
-            csProperties = singletonMap(CoordinateSystem.NAME_KEY, name);
+            csProperties = Map.of(CoordinateSystem.NAME_KEY, name);
         } else {
             csProperties.put(CoordinateSystem.NAME_KEY, name);
         }
@@ -2250,8 +2250,8 @@ class GeodeticObjectParser extends MathTransformParser implements Comparator<Coo
                         number, AxisDirection.OTHER, Units.UNITY);
             }
             final Map<String,Object> properties = parseMetadataAndClose(element, name, baseCRS);
-            final CoordinateSystem derivedCS = new AbstractCS(
-                    singletonMap(CoordinateSystem.NAME_KEY, AxisDirections.appendTo(new StringBuilder("CS"), axes)), axes);
+            final Map<String,Object> axisName = singletonMap(CoordinateSystem.NAME_KEY, AxisDirections.appendTo(new StringBuilder("CS"), axes));
+            final CoordinateSystem derivedCS = new AbstractCS(axisName, axes);
             /*
              * Creates a derived CRS from the information found in a WKT 1 {@code FITTED_CS} element.
              * This coordinate system cannot be easily constructed from the information provided by
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/VerticalInfo.java b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/VerticalInfo.java
index db684f615f..d62c5db8a5 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/VerticalInfo.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/io/wkt/VerticalInfo.java
@@ -17,7 +17,6 @@
 package org.apache.sis.io.wkt;
 
 import java.util.Map;
-import java.util.Collections;
 import javax.measure.Unit;
 import javax.measure.quantity.Length;
 import org.opengis.util.FactoryException;
@@ -190,6 +189,6 @@ final class VerticalInfo {
      * Convenience method for creating the map of properties to give to the factory method.
      */
     private static Map<String,?> properties(final Object name) {
-        return Collections.singletonMap(IdentifiedObject.NAME_KEY, name);
+        return Map.of(IdentifiedObject.NAME_KEY, name);
     }
 }
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/parameter/MapProjectionParameters.java b/core/sis-referencing/src/main/java/org/apache/sis/parameter/MapProjectionParameters.java
index 0a3b75590f..8f29037b32 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/parameter/MapProjectionParameters.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/parameter/MapProjectionParameters.java
@@ -16,7 +16,6 @@
  */
 package org.apache.sis.parameter;
 
-import java.util.Collections;
 import java.util.Map;
 import java.util.Objects;
 import javax.measure.Unit;
@@ -168,7 +167,7 @@ final class MapProjectionParameters extends DefaultParameterValueGroup {
          * This is not a standard parameter.
          */
         static final ParameterDescriptor<Double> DESCRIPTOR = new DefaultParameterDescriptor<>(
-                InverseFlattening.toMap(Constants.EARTH_RADIUS), 0, 1, Double.class,
+                InverseFlattening.properties(Constants.EARTH_RADIUS), 0, 1, Double.class,
                 MeasurementRange.createGreaterThan(0.0, Units.METRE), null, null);
 
         /**
@@ -253,14 +252,14 @@ final class MapProjectionParameters extends DefaultParameterValueGroup {
          * This is not a standard parameter.
          */
         static final ParameterDescriptor<Double> DESCRIPTOR = new DefaultParameterDescriptor<>(
-                toMap(Constants.INVERSE_FLATTENING), 0, 1, Double.class,
+                properties(Constants.INVERSE_FLATTENING), 0, 1, Double.class,
                 MeasurementRange.createGreaterThan(0.0, Units.UNITY), null, null);
 
         /**
          * Helper method for {@link #DESCRIPTOR} constructions.
          */
-        static Map<String,?> toMap(final String name) {
-            return Collections.singletonMap(NAME_KEY, new NamedIdentifier(NETCDF, name));
+        private static Map<String,?> properties(final String name) {
+            return Map.of(NAME_KEY, new NamedIdentifier(NETCDF, name));
         }
 
         /**
@@ -372,7 +371,7 @@ final class MapProjectionParameters extends DefaultParameterValueGroup {
          * This is not a standard parameter.
          */
         static final ParameterDescriptor<Boolean> DESCRIPTOR = new DefaultParameterDescriptor<>(
-                InverseFlattening.toMap(Constants.IS_IVF_DEFINITIVE), 0, 1, Boolean.class, null, null, Boolean.FALSE);
+                InverseFlattening.properties(Constants.IS_IVF_DEFINITIVE), 0, 1, Boolean.class, null, null, Boolean.FALSE);
 
         /**
          * The parameters for the inverse flattening factor.
@@ -437,7 +436,7 @@ final class MapProjectionParameters extends DefaultParameterValueGroup {
          * {@value Constants#STANDARD_PARALLEL_2}. This is not a standard parameter.
          */
         static final ParameterDescriptor<double[]> DESCRIPTOR = new DefaultParameterDescriptor<>(
-                InverseFlattening.toMap(Constants.STANDARD_PARALLEL),
+                InverseFlattening.properties(Constants.STANDARD_PARALLEL),
                 0, 1, double[].class, null, null, null);
 
         /**
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/parameter/TensorParameters.java b/core/sis-referencing/src/main/java/org/apache/sis/parameter/TensorParameters.java
index 050efa075c..b4dda2e9df 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/parameter/TensorParameters.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/parameter/TensorParameters.java
@@ -20,7 +20,6 @@ import java.util.Map;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.Objects;
 import java.io.IOException;
 import java.io.Serializable;
@@ -125,7 +124,7 @@ import org.apache.sis.util.resources.Errors;
  * one can use the following code:
  *
  * {@preformat java
- *   Map<String,?> properties = Collections.singletonMap(ParameterValueGroup.NAME_KEY, "Affine");
+ *   Map<String,?> properties = Map.of(ParameterValueGroup.NAME_KEY, "Affine");
  *   ParameterValueGroup p = TensorParameters.WKT1.createValueGroup(properties);
  * }
  *
@@ -496,7 +495,7 @@ public class TensorParameters<E> implements Serializable {
         final Citation authority = dimensions[0].getName().getAuthority();
         final String name = indicesToName(indices);
         return new DefaultParameterDescriptor<>(
-                Collections.singletonMap(ParameterDescriptor.NAME_KEY, new NamedIdentifier(authority, name)),
+                Map.of(ParameterDescriptor.NAME_KEY, new NamedIdentifier(authority, name)),
                 0, 1, elementType, null, null, getDefaultValue(indices));
     }
 
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/CommonCRS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/CommonCRS.java
index ed26242904..f1dd4fffc5 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/CommonCRS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/CommonCRS.java
@@ -2008,7 +2008,7 @@ public enum CommonCRS {
      * Puts the given name in a map of properties to be given to object constructors.
      */
     private static Map<String,?> properties(final InternationalString name) {
-        return singletonMap(NAME_KEY, new NamedIdentifier(null, name));
+        return Map.of(NAME_KEY, new NamedIdentifier(null, name));
     }
 
     /**
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/Normalizer.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/Normalizer.java
index e9a41d00f1..c859f5d8a1 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/Normalizer.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/Normalizer.java
@@ -38,7 +38,6 @@ import org.apache.sis.util.CharSequences;
 import org.apache.sis.util.ArraysExt;
 import org.apache.sis.measure.Units;
 
-import static java.util.Collections.singletonMap;
 import static org.opengis.referencing.IdentifiedObject.NAME_KEY;
 import static org.opengis.referencing.IdentifiedObject.IDENTIFIERS_KEY;
 
@@ -364,7 +363,7 @@ final class Normalizer implements Comparable<Normalizer> {
          */
         final AbstractCS impl = castOrCopy(cs);
         final StringBuilder buffer = (StringBuilder) CharSequences.camelCaseToSentence(impl.getInterface().getSimpleName());
-        return impl.createForAxes(singletonMap(AbstractCS.NAME_KEY, AxisDirections.appendTo(buffer, newAxes)), newAxes);
+        return impl.createForAxes(Map.of(AbstractCS.NAME_KEY, AxisDirections.appendTo(buffer, newAxes)), newAxes);
     }
 
     /**
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/MultiAuthoritiesFactory.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/MultiAuthoritiesFactory.java
index 32f4666d1d..73ebd52965 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/MultiAuthoritiesFactory.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/MultiAuthoritiesFactory.java
@@ -1610,7 +1610,7 @@ public class MultiAuthoritiesFactory extends GeodeticAuthorityFactory implements
                     String name = IdentifiedObjects.getIdentifierOrName(ops[0]) + " ⟶ "
                                 + IdentifiedObjects.getIdentifierOrName(ops[ops.length - 1]);
                     combined = DefaultFactories.forBuildin(CoordinateOperationFactory.class)
-                            .createConcatenatedOperation(Collections.singletonMap(CoordinateOperation.NAME_KEY, name), ops);
+                            .createConcatenatedOperation(Map.of(CoordinateOperation.NAME_KEY, name), ops);
                 }
                 break;
             }
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java
index 8ef1e80388..fceeab719f 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java
@@ -1216,7 +1216,7 @@ public class CoordinateOperationFinder extends CoordinateOperationRegistry {
      * Returns the given name in a singleton map.
      */
     private static Map<String,?> properties(final String name) {
-        return Collections.singletonMap(IdentifiedObject.NAME_KEY, name);
+        return Map.of(IdentifiedObject.NAME_KEY, name);
     }
 
     /**
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultOperationMethod.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultOperationMethod.java
index 97ccaf727a..c953838d50 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultOperationMethod.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultOperationMethod.java
@@ -20,7 +20,6 @@ import java.util.Map;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Objects;
-import java.util.Collections;
 import javax.xml.bind.Unmarshaller;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.XmlElement;
@@ -321,7 +320,7 @@ public class DefaultOperationMethod extends AbstractIdentifiedObject implements
                 return getProperties(parameters, null);
             }
         }
-        return Collections.singletonMap(NAME_KEY, NilReferencingObject.UNNAMED);
+        return Map.of(NAME_KEY, NilReferencingObject.UNNAMED);
     }
 
     /**
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/CoordinateSystemTransform.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/CoordinateSystemTransform.java
index 7e38b4cf47..7469abd426 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/CoordinateSystemTransform.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/CoordinateSystemTransform.java
@@ -17,7 +17,6 @@
 package org.apache.sis.referencing.operation.transform;
 
 import java.util.Map;
-import java.util.Collections;
 import javax.measure.IncommensurableException;
 import org.opengis.util.FactoryException;
 import org.opengis.parameter.ParameterValueGroup;
@@ -112,7 +111,7 @@ abstract class CoordinateSystemTransform extends AbstractMathTransform {
      * Creates an operation method of the given name.
      */
     private static OperationMethod method(final String name) {
-        final Map<String,?> properties = Collections.singletonMap(DefaultParameterDescriptorGroup.NAME_KEY,
+        final Map<String,?> properties = Map.of(DefaultParameterDescriptorGroup.NAME_KEY,
                 new ImmutableIdentifier(Citations.SIS, Constants.SIS, name));
         final DefaultParameterDescriptorGroup descriptor = new DefaultParameterDescriptorGroup(properties, 1, 1);
         return new DefaultOperationMethod(properties, descriptor);
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/EllipsoidToCentricTransform.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/EllipsoidToCentricTransform.java
index d5c68fcb05..fd0bca751b 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/EllipsoidToCentricTransform.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/EllipsoidToCentricTransform.java
@@ -16,9 +16,9 @@
  */
 package org.apache.sis.referencing.operation.transform;
 
+import java.util.Map;
 import java.util.List;
 import java.util.Arrays;
-import java.util.Collections;
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.Serializable;
@@ -842,8 +842,7 @@ next:   while (--numPts >= 0) {
         @Override
         public ParameterDescriptorGroup getParameterDescriptors() {
             ImmutableIdentifier name = new ImmutableIdentifier(Citations.SIS, Constants.SIS, "Centric to ellipsoid (radians domain)");
-            return new DefaultParameterDescriptorGroup(Collections.singletonMap(ParameterDescriptorGroup.NAME_KEY, name),
-                    forward.getParameterDescriptors());
+            return new DefaultParameterDescriptorGroup(Map.of(ParameterDescriptorGroup.NAME_KEY, name), forward.getParameterDescriptors());
         }
 
         /**
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/MathTransformProvider.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/MathTransformProvider.java
index b20986b967..498f66f09d 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/MathTransformProvider.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/MathTransformProvider.java
@@ -52,7 +52,7 @@ import org.opengis.referencing.operation.MathTransformFactory;
  * <div class="note">{@preformat java
  *     public class MyProjectionProvider extends DefaultOperationMethod implements MathTransformProvider {
  *         public MyProjectionProvider() {
- *             super(Collections.singletonMap(NAME_KEY, "My projection"),
+ *             super(Map.of(NAME_KEY, "My projection"),
  *                     2, // Number of source dimensions
  *                     2, // Number of target dimensions
  *                     parameters);
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/PoleRotation.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/PoleRotation.java
index 239b149cdd..398a571d7e 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/PoleRotation.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/PoleRotation.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.referencing.operation.transform;
 
-import java.util.Collections;
+import java.util.Map;
 import java.io.Serializable;
 import org.opengis.util.FactoryException;
 import org.opengis.referencing.operation.Matrix;
@@ -327,8 +327,8 @@ public class PoleRotation extends AbstractMathTransform2D implements Serializabl
     public ParameterDescriptorGroup getParameterDescriptors() {
         // We assume that it is not worth to cache this descriptor.
         ImmutableIdentifier name = new ImmutableIdentifier(Citations.SIS, Constants.SIS, "Rotated Latitude/longitude (radians domain)");
-        return new DefaultParameterDescriptorGroup(Collections.singletonMap(ParameterDescriptorGroup.NAME_KEY, name),
-                1, 1, (ParameterDescriptor<?>) context.getDescriptor().descriptors().get(0));
+        return new DefaultParameterDescriptorGroup(Map.of(ParameterDescriptorGroup.NAME_KEY, name),
+                    1, 1, (ParameterDescriptor<?>) context.getDescriptor().descriptors().get(0));
     }
 
     /**
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/geometry/EnvelopesTest.java b/core/sis-referencing/src/test/java/org/apache/sis/geometry/EnvelopesTest.java
index 89814df78c..ce75666d47 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/geometry/EnvelopesTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/geometry/EnvelopesTest.java
@@ -18,7 +18,7 @@ package org.apache.sis.geometry;
 
 import java.time.Instant;
 import java.util.List;
-import java.util.Collections;
+import java.util.Map;
 import org.apache.sis.measure.Range;
 import org.opengis.geometry.Envelope;
 import org.opengis.util.FactoryException;
@@ -165,7 +165,7 @@ public final strictfp class EnvelopesTest extends TransformTestCase<GeneralEnvel
     public void testTransform4to2D() throws TransformException {
         final CoordinateReferenceSystem targetCRS = HardCodedCRS.WGS84;
         final CoordinateReferenceSystem sourceCRS = new DefaultCompoundCRS(
-                Collections.singletonMap(DefaultCompoundCRS.NAME_KEY, "4D CRS"),
+                Map.of(DefaultCompoundCRS.NAME_KEY, "4D CRS"),
                 HardCodedCRS.WGS84,
                 HardCodedCRS.GRAVITY_RELATED_HEIGHT,
                 HardCodedCRS.TIME);
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/internal/jaxb/referencing/CC_OperationParameterGroupTest.java b/core/sis-referencing/src/test/java/org/apache/sis/internal/jaxb/referencing/CC_OperationParameterGroupTest.java
index c4622ecd5a..6e6ee00cba 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/internal/jaxb/referencing/CC_OperationParameterGroupTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/internal/jaxb/referencing/CC_OperationParameterGroupTest.java
@@ -19,7 +19,6 @@ package org.apache.sis.internal.jaxb.referencing;
 import java.util.List;
 import java.util.Map;
 import java.util.IdentityHashMap;
-import java.util.Collections;
 import javax.xml.bind.JAXBException;
 import org.opengis.metadata.Identifier;
 import org.opengis.parameter.ParameterDescriptor;
@@ -163,7 +162,7 @@ public final strictfp class CC_OperationParameterGroupTest extends TestCase {
         /*
          * All references to 'fromValue' will need to be replaced by references to 'complete'.
          */
-        assertEquals("replacements", Collections.singletonMap(fromValue, complete), replacements);
+        assertEquals("replacements", Map.of(fromValue, complete), replacements);
     }
 
     /**
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/internal/jaxb/referencing/SecondDefiningParameterTest.java b/core/sis-referencing/src/test/java/org/apache/sis/internal/jaxb/referencing/SecondDefiningParameterTest.java
index 4406a32dab..e69da46ea9 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/internal/jaxb/referencing/SecondDefiningParameterTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/internal/jaxb/referencing/SecondDefiningParameterTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.internal.jaxb.referencing;
 
-import java.util.Collections;
+import java.util.Map;
 import javax.xml.bind.JAXBException;
 import org.apache.sis.measure.Units;
 import org.apache.sis.referencing.datum.DefaultEllipsoid;
@@ -63,9 +63,10 @@ public final strictfp class SecondDefiningParameterTest extends TestCase {
      */
     @Test
     public void testMarshalling() throws JAXBException {
-        final DefaultEllipsoid ellipsoid = DefaultEllipsoid.createEllipsoid(Collections.singletonMap(
-                DefaultEllipsoid.NAME_KEY, "Clarke 1866"), 6378206.4, 6356583.8, Units.METRE);
-        final SecondDefiningParameter sdp = new SecondDefiningParameter(ellipsoid, false);
+        final var ellipsoid = DefaultEllipsoid.createEllipsoid(
+                Map.of(DefaultEllipsoid.NAME_KEY, "Clarke 1866"),
+                6378206.4, 6356583.8, Units.METRE);
+        final var sdp = new SecondDefiningParameter(ellipsoid, false);
         assertXmlEquals(ELLIPSOID, marshal(sdp), "xmlns:*", "xsi:schemaLocation");
     }
 
@@ -89,9 +90,10 @@ public final strictfp class SecondDefiningParameterTest extends TestCase {
      */
     @Test
     public void testMarshallingSphere() throws JAXBException {
-        final DefaultEllipsoid ellipsoid = DefaultEllipsoid.createEllipsoid(Collections.singletonMap(
-                DefaultEllipsoid.NAME_KEY, "Sphere"), 6371000, 6371000, Units.METRE);
-        final SecondDefiningParameter sdp = new SecondDefiningParameter(ellipsoid, false);
+        final var ellipsoid = DefaultEllipsoid.createEllipsoid(
+                Map.of(DefaultEllipsoid.NAME_KEY, "Sphere"),
+                6371000, 6371000, Units.METRE);
+        final var sdp = new SecondDefiningParameter(ellipsoid, false);
         assertXmlEquals(SPHERE, marshal(sdp), "xmlns:*", "xsi:schemaLocation");
     }
 
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/EllipsoidalHeightCombinerTest.java b/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/EllipsoidalHeightCombinerTest.java
index c733c58984..178393da19 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/EllipsoidalHeightCombinerTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/EllipsoidalHeightCombinerTest.java
@@ -17,7 +17,6 @@
 package org.apache.sis.internal.referencing;
 
 import java.util.Map;
-import java.util.Collections;
 import org.opengis.referencing.cs.AxisDirection;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.opengis.referencing.crs.SingleCRS;
@@ -74,7 +73,7 @@ public final strictfp class EllipsoidalHeightCombinerTest extends TestCase {
     @Test
     public void testGeographicCRS() throws FactoryException {
         final EllipsoidalHeightCombiner services = create();
-        final Map<String,String> properties = Collections.singletonMap(CoordinateReferenceSystem.NAME_KEY, "WGS 84 (4D)");
+        final var properties = Map.of(CoordinateReferenceSystem.NAME_KEY, "WGS 84 (4D)");
         final GeographicCRS horizontal = HardCodedCRS.WGS84;
         final GeographicCRS volumetric = HardCodedCRS.WGS84_3D;
         final VerticalCRS   vertical   = HardCodedCRS.ELLIPSOIDAL_HEIGHT;
@@ -119,8 +118,8 @@ public final strictfp class EllipsoidalHeightCombinerTest extends TestCase {
     @DependsOnMethod("testGeographicCRS")
     public void testProjectedCRS() throws FactoryException {
         final EllipsoidalHeightCombiner services = create();
-        final GeodeticObjectFactory factory = new GeodeticObjectFactory();
-        final Map<String,String> properties = Collections.singletonMap(CoordinateReferenceSystem.NAME_KEY, "World Mercator (4D)");
+        final var factory = new GeodeticObjectFactory();
+        final var properties = Map.of(CoordinateReferenceSystem.NAME_KEY, "World Mercator (4D)");
         final ProjectedCRS horizontal = factory.createProjectedCRS(properties, HardCodedCRS.WGS84,    HardCodedConversions.MERCATOR, HardCodedCS.PROJECTED);
         final ProjectedCRS volumetric = factory.createProjectedCRS(properties, HardCodedCRS.WGS84_3D, HardCodedConversions.MERCATOR, HardCodedCS.PROJECTED_3D);
         final VerticalCRS  vertical   = HardCodedCRS.ELLIPSOIDAL_HEIGHT;
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/FormulasTest.java b/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/FormulasTest.java
index aae1391c78..cc3cd00182 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/FormulasTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/FormulasTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.internal.referencing;
 
-import java.util.Collections;
+import java.util.Map;
 import org.opengis.referencing.datum.Ellipsoid;
 import org.apache.sis.internal.metadata.ReferencingServices;
 import org.apache.sis.measure.Longitude;
@@ -119,8 +119,9 @@ public final strictfp class FormulasTest extends TestCase {
      */
     @Test
     public void testRadiusOfConformalSphere() {
-        final DefaultEllipsoid ellipsoid = DefaultEllipsoid.createFlattenedSphere(
-                Collections.singletonMap(DefaultEllipsoid.NAME_KEY, "Bessel 1841"), 6377397.155, 299.1528128, Units.METRE);
+        final var ellipsoid = DefaultEllipsoid.createFlattenedSphere(
+                Map.of(DefaultEllipsoid.NAME_KEY, "Bessel 1841"),
+                6377397.155, 299.1528128, Units.METRE);
         assertEquals(6382644.571, Formulas.radiusOfConformalSphere(ellipsoid, StrictMath.toRadians(52.156160556)), 0.001);
     }
 
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/io/wkt/WKTFormatTest.java b/core/sis-referencing/src/test/java/org/apache/sis/io/wkt/WKTFormatTest.java
index 5666341864..a0b793bf07 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/io/wkt/WKTFormatTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/io/wkt/WKTFormatTest.java
@@ -16,8 +16,8 @@
  */
 package org.apache.sis.io.wkt;
 
+import java.util.Map;
 import java.util.Locale;
-import java.util.Collections;
 import java.text.ParseException;
 import org.opengis.referencing.crs.VerticalCRS;
 import org.apache.sis.measure.Units;
@@ -421,8 +421,9 @@ public final strictfp class WKTFormatTest extends TestCase {
      */
     @Test
     public void testWarnings() throws ParseException {
-        DefaultPrimeMeridian pm = new DefaultPrimeMeridian(Collections.singletonMap(
-                DefaultPrimeMeridian.NAME_KEY, "Invalid “$name” here"), -10, Units.DEGREE);
+        DefaultPrimeMeridian pm = new DefaultPrimeMeridian(
+                Map.of(DefaultPrimeMeridian.NAME_KEY, "Invalid “$name” here"),
+                -10, Units.DEGREE);
         format = new WKTFormat(Locale.US, null);
         final String   wkt      = format.format(pm);
         final Warnings warnings = format.getWarnings();
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/parameter/DefaultParameterDescriptorGroupTest.java b/core/sis-referencing/src/test/java/org/apache/sis/parameter/DefaultParameterDescriptorGroupTest.java
index 629f3d34c3..88e0487826 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/parameter/DefaultParameterDescriptorGroupTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/parameter/DefaultParameterDescriptorGroupTest.java
@@ -19,7 +19,6 @@ package org.apache.sis.parameter;
 import java.util.Map;
 import java.util.List;
 import java.util.HashMap;
-import java.util.Collections;
 import org.opengis.parameter.ParameterDirection;
 import org.opengis.parameter.GeneralParameterDescriptor;
 import org.opengis.parameter.ParameterNotFoundException;
@@ -31,7 +30,6 @@ import org.apache.sis.test.TestCase;
 import org.junit.Test;
 
 import static org.opengis.test.Validators.*;
-import static java.util.Collections.singletonMap;
 import static org.apache.sis.test.ReferencingAssert.*;
 import static org.opengis.referencing.IdentifiedObject.*;
 
@@ -62,7 +60,7 @@ public final strictfp class DefaultParameterDescriptorGroupTest extends TestCase
     static {
         final Class<Integer> type = Integer.class;
         final Map<String,Object> properties = new HashMap<>(4);
-        M1_M1_O1_O2 = new DefaultParameterDescriptorGroup(singletonMap(NAME_KEY, "Test group"), 0, 1,
+        M1_M1_O1_O2 = new DefaultParameterDescriptorGroup(Map.of(NAME_KEY, "Test group"), 0, 1,
             new DefaultParameterDescriptor<>(name(properties, "Mandatory 1", "Ambiguity"), 1, 1, type, null, null, DEFAULT_VALUE),
             new DefaultParameterDescriptor<>(name(properties, "Mandatory 2", "Alias 2"),   1, 1, type, null, null, DEFAULT_VALUE),
             new DefaultParameterDescriptor<>(name(properties, "Optional 3",  "Alias 3"),   0, 1, type, null, null, DEFAULT_VALUE),
@@ -91,7 +89,7 @@ public final strictfp class DefaultParameterDescriptorGroupTest extends TestCase
         p1 = new DefaultParameterDescriptor<>(name(properties,   "Name",  null), 1, 1, type, null, null, null);
         p2 = new DefaultParameterDescriptor<>(name(properties, "  NAME ", null), 1, 1, type, null, null, null);
         try {
-            new DefaultParameterDescriptorGroup(singletonMap(NAME_KEY, "Test group"), 0, 1, p1, p2);
+            new DefaultParameterDescriptorGroup(Map.of(NAME_KEY, "Test group"), 0, 1, p1, p2);
             fail("Constructor should have detected the duplicated names.");
         } catch (IllegalArgumentException e) {
             final String message = e.getMessage();
@@ -218,8 +216,7 @@ public final strictfp class DefaultParameterDescriptorGroupTest extends TestCase
          * Here, the URI should be omitted because it is a long value which does not
          * bring new information, since it is computed from other values.
          */
-        final DefaultParameterDescriptorGroup group = new DefaultParameterDescriptorGroup(
-                Collections.singletonMap(NAME_KEY, "Affine"), 1, 1, descriptor);
+        final var group = new DefaultParameterDescriptorGroup(Map.of(NAME_KEY, "Affine"), 1, 1, descriptor);
         assertWktEquals("PARAMETERGROUP[“Affine”,\n" +
                         "  PARAMETER[“A0”, ID[“EPSG”, 8623]]]", group);
     }
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/parameter/DefaultParameterValueGroupTest.java b/core/sis-referencing/src/test/java/org/apache/sis/parameter/DefaultParameterValueGroupTest.java
index 45b145258e..1568993685 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/parameter/DefaultParameterValueGroupTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/parameter/DefaultParameterValueGroupTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.parameter;
 
+import java.util.Map;
 import java.util.List;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -35,7 +36,6 @@ import org.junit.Test;
 
 import static org.apache.sis.test.Assert.*;
 import static org.opengis.test.Validators.*;
-import static java.util.Collections.singletonMap;
 import static org.opengis.referencing.IdentifiedObject.NAME_KEY;
 
 
@@ -239,10 +239,10 @@ public final strictfp class DefaultParameterValueGroupTest extends TestCase {
     public void testValuesAddAllWithSubgroups() {
         final DefaultParameterDescriptorGroup group, subGroup;
         final List<GeneralParameterDescriptor> descriptors = new ArrayList<>(descriptor.descriptors());
-        subGroup = new DefaultParameterDescriptorGroup(singletonMap(NAME_KEY, "theSubGroup"),
+        subGroup = new DefaultParameterDescriptorGroup(Map.of(NAME_KEY, "theSubGroup"),
                 2, 4, descriptors.toArray(GeneralParameterDescriptor[]::new));
         descriptors.add(subGroup);
-        group = new DefaultParameterDescriptorGroup(singletonMap(NAME_KEY, "theGroup"),
+        group = new DefaultParameterDescriptorGroup(Map.of(NAME_KEY, "theGroup"),
                 descriptors.toArray(GeneralParameterDescriptor[]::new));
         /*
          * Prepare the GeneralParameterValue instances that we are going to add in the above group.
@@ -295,7 +295,7 @@ public final strictfp class DefaultParameterValueGroupTest extends TestCase {
         final DefaultParameterValueGroup    group = createGroup(10);
         final List<GeneralParameterValue>  values = group.values();
         final ParameterValue<Integer> nonExistent = new DefaultParameterDescriptor<>(
-                singletonMap(NAME_KEY, "Optional 5"), 0, 1, Integer.class, null, null, null).createValue();
+                Map.of(NAME_KEY, "Optional 5"), 0, 1, Integer.class, null, null, null).createValue();
         try {
             values.add(nonExistent);
             fail("“Optional 5” is not a parameter for this group.");
@@ -385,8 +385,8 @@ public final strictfp class DefaultParameterValueGroupTest extends TestCase {
      */
     @Test
     public void testAddGroup() {
-        descriptor = new DefaultParameterDescriptorGroup(singletonMap(NAME_KEY, "theGroup"), 1, 1,
-                new DefaultParameterDescriptorGroup(singletonMap(NAME_KEY, "theSubGroup"), 0, 10)
+        descriptor = new DefaultParameterDescriptorGroup(Map.of(NAME_KEY, "theGroup"), 1, 1,
+                new DefaultParameterDescriptorGroup(Map.of(NAME_KEY, "theSubGroup"), 0, 10)
         );
         validate(descriptor);
 
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/parameter/MapProjectionParametersTest.java b/core/sis-referencing/src/test/java/org/apache/sis/parameter/MapProjectionParametersTest.java
index 09b2657135..05119744ce 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/parameter/MapProjectionParametersTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/parameter/MapProjectionParametersTest.java
@@ -17,7 +17,6 @@
 package org.apache.sis.parameter;
 
 import java.util.Map;
-import java.util.Collections;
 import org.opengis.parameter.ParameterDescriptor;
 import org.opengis.parameter.ParameterValue;
 import org.opengis.parameter.ParameterValueGroup;
@@ -73,7 +72,7 @@ public final strictfp class MapProjectionParametersTest extends TestCase {
 
     /** Returns properties map for an object of the given name. */
     private static Map<String,String> name(final String name) {
-        return Collections.singletonMap(MapProjectionDescriptor.NAME_KEY, name);
+        return Map.of(MapProjectionDescriptor.NAME_KEY, name);
     }
 
     /**
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/parameter/ParameterMarshallingTest.java b/core/sis-referencing/src/test/java/org/apache/sis/parameter/ParameterMarshallingTest.java
index c5a6480713..7beab8be4b 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/parameter/ParameterMarshallingTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/parameter/ParameterMarshallingTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.parameter;
 
-import java.util.Collections;
+import java.util.Map;
 import java.util.Iterator;
 import java.util.Objects;
 import java.net.URI;
@@ -60,8 +60,7 @@ public final strictfp class ParameterMarshallingTest extends TestCase {
      */
     private static <T> DefaultParameterValue<T> create(final Class<T> type, final Range<?> valueDomain) {
         return new DefaultParameterValue<>(new DefaultParameterDescriptor<>(
-                Collections.singletonMap(DefaultParameterDescriptor.NAME_KEY,
-                        "A parameter of type " + type.getSimpleName()),
+                Map.of(DefaultParameterDescriptor.NAME_KEY, "A parameter of type " + type.getSimpleName()),
                 1, 1, type, valueDomain, null, null));
     }
 
@@ -106,7 +105,7 @@ public final strictfp class ParameterMarshallingTest extends TestCase {
     @Test
     public void testDescriptor() throws JAXBException {
         final DefaultParameterDescriptor<Double> descriptor = new DefaultParameterDescriptor<>(
-                Collections.singletonMap(DefaultParameterDescriptor.NAME_KEY, "A descriptor"),
+                Map.of(DefaultParameterDescriptor.NAME_KEY, "A descriptor"),
                 0, 1, Double.class, null, null, null);
         final String xml = XML.marshal(descriptor);
         assertXmlEquals(
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/parameter/ParametersTest.java b/core/sis-referencing/src/test/java/org/apache/sis/parameter/ParametersTest.java
index 37dd35ef44..d248b93810 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/parameter/ParametersTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/parameter/ParametersTest.java
@@ -16,9 +16,9 @@
  */
 package org.apache.sis.parameter;
 
+import java.util.Map;
 import java.util.Set;
 import java.util.Collection;
-import java.util.Collections;
 import javax.measure.Unit;
 import org.opengis.parameter.ParameterDescriptor;
 import org.opengis.parameter.ParameterDirection;
@@ -151,7 +151,7 @@ public final strictfp class ParametersTest extends TestCase {
          */
         final String subgroupName = DefaultParameterDescriptorGroupTest.M1_M1_O1_O2.getName().getCode();
         final DefaultParameterDescriptorGroup descriptor = new DefaultParameterDescriptorGroup(
-                Collections.singletonMap(DefaultParameterDescriptorGroup.NAME_KEY, "parent"), 1, 1,
+                Map.of(DefaultParameterDescriptorGroup.NAME_KEY, "parent"), 1, 1,
                 DefaultParameterDescriptorTest.createSimpleOptional("A parent parameter", String.class),
                 DefaultParameterDescriptorGroupTest.M1_M1_O1_O2);
         /*
@@ -199,7 +199,7 @@ public final strictfp class ParametersTest extends TestCase {
     public void testGetIntValue() {
         final ParameterDescriptor<Integer> descriptor = DefaultParameterDescriptorTest.create("My param", 5, 15, 10);
         final ParameterDescriptor<Integer> incomplete = DefaultParameterDescriptorTest.createSimpleOptional("My param", Integer.class);
-        final Parameters group = Parameters.castOrWrap(new DefaultParameterDescriptorGroup(Collections.singletonMap(
+        final Parameters group = Parameters.castOrWrap(new DefaultParameterDescriptorGroup(Map.of(
                 DefaultParameterDescriptorGroup.NAME_KEY, "My group"), 1, 1, incomplete).createValue());
         /*
          * Test when the ParameterValueGroup is empty. We test both with the "incomplete" descriptor,
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/parameter/TensorParametersTest.java b/core/sis-referencing/src/test/java/org/apache/sis/parameter/TensorParametersTest.java
index dd4f1981e7..bb1969ebd1 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/parameter/TensorParametersTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/parameter/TensorParametersTest.java
@@ -29,7 +29,6 @@ import org.apache.sis.test.TestCase;
 import org.junit.AfterClass;
 import org.junit.Test;
 
-import static java.util.Collections.singletonMap;
 import static org.opengis.test.Validators.validate;
 import static org.apache.sis.test.ReferencingAssert.*;
 import static org.apache.sis.internal.util.Constants.NUM_ROW;
@@ -320,7 +319,7 @@ public strictfp class TensorParametersTest extends TestCase {
                     }
                 }
                 final ParameterValueGroup group = param.createValueGroup(
-                        singletonMap(ParameterDescriptor.NAME_KEY, "Test"), matrix);
+                        Map.of(ParameterDescriptor.NAME_KEY, "Test"), matrix);
                 validate(group);
                 assertEquals(NUM_ROW,    numRow, group.parameter(NUM_ROW).intValue());
                 assertEquals(NUM_COL,    numCol, group.parameter(NUM_COL).intValue());
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/parameter/TensorValuesTest.java b/core/sis-referencing/src/test/java/org/apache/sis/parameter/TensorValuesTest.java
index f2fc84dbbb..3261ff0759 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/parameter/TensorValuesTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/parameter/TensorValuesTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.parameter;
 
+import java.util.Map;
 import java.util.List;
 import org.opengis.parameter.ParameterValue;
 import org.opengis.parameter.ParameterValueGroup;
@@ -33,7 +34,6 @@ import org.apache.sis.test.DependsOn;
 import org.apache.sis.test.TestCase;
 import org.junit.Test;
 
-import static java.util.Collections.singletonMap;
 import static org.opengis.test.Validators.validate;
 import static org.apache.sis.test.ReferencingAssert.*;
 import static org.apache.sis.internal.util.Constants.NUM_ROW;
@@ -59,14 +59,14 @@ public final strictfp class TensorValuesTest extends TestCase {
      * Creates an instance for a matrix using the WKT 1 conventions.
      */
     private static ParameterValueGroup createWKT1() {
-        return TensorParameters.WKT1.createValueGroup(singletonMap(TensorValues.NAME_KEY, GROUP_NAME));
+        return TensorParameters.WKT1.createValueGroup(Map.of(TensorValues.NAME_KEY, GROUP_NAME));
     }
 
     /**
      * Creates an instance for a matrix using the alphanumeric (EPSG) conventions.
      */
     private static ParameterValueGroup createAlphaNumeric() {
-        return TensorParameters.ALPHANUM.createValueGroup(singletonMap(TensorValues.NAME_KEY, GROUP_NAME));
+        return TensorParameters.ALPHANUM.createValueGroup(Map.of(TensorValues.NAME_KEY, GROUP_NAME));
     }
 
     /**
@@ -318,7 +318,7 @@ public final strictfp class TensorValuesTest extends TestCase {
         matrix.setElement(1,0, -2);
         matrix.setElement(2,2,  7);
         final ParameterValueGroup group = TensorParameters.WKT1.createValueGroup(
-                singletonMap(TensorValues.NAME_KEY, Constants.AFFINE), matrix);
+                Map.of(TensorValues.NAME_KEY, Constants.AFFINE), matrix);
         validate(group);
         assertWktEquals(
                 "PARAMETERGROUP[“Affine”,\n"      +
@@ -345,7 +345,7 @@ public final strictfp class TensorValuesTest extends TestCase {
         matrix.setElement(1,0, -2);
         matrix.setElement(2,2,  7);
         final ParameterValueGroup group = TensorParameters.ALPHANUM.createValueGroup(
-                singletonMap(TensorValues.NAME_KEY, Affine.NAME), matrix);
+                Map.of(TensorValues.NAME_KEY, Affine.NAME), matrix);
         validate(group);
         assertWktEquals(
                 "PARAMETERGROUP[“Affine parametric transformation”,\n" +
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/AbstractCRSTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/AbstractCRSTest.java
index 2bfb1b8fa7..a66e955b40 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/AbstractCRSTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/AbstractCRSTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.referencing.crs;
 
+import java.util.Map;
 import org.apache.sis.referencing.cs.AbstractCS;
 import org.apache.sis.referencing.cs.HardCodedAxes;
 import org.apache.sis.referencing.cs.AxesConvention;
@@ -23,7 +24,6 @@ import org.apache.sis.test.DependsOn;
 import org.apache.sis.test.TestCase;
 import org.junit.Test;
 
-import static java.util.Collections.singletonMap;
 import static org.opengis.referencing.cs.CoordinateSystem.NAME_KEY;
 import static org.apache.sis.test.Assert.*;
 
@@ -44,11 +44,11 @@ public final strictfp class AbstractCRSTest extends TestCase {
     @Test
     public void testForRightHandedConvention() {
         final AbstractCRS toTest, expected, actual;
-        toTest   =  new AbstractCRS(singletonMap(NAME_KEY, "My CRS"),
-                    new AbstractCS (singletonMap(NAME_KEY, "My strange CS"),
+        toTest   =  new AbstractCRS(Map.of(NAME_KEY, "My CRS"),
+                    new AbstractCS (Map.of(NAME_KEY, "My strange CS"),
                     HardCodedAxes.TIME, HardCodedAxes.ALTITUDE, HardCodedAxes.GEODETIC_LATITUDE, HardCodedAxes.GEODETIC_LONGITUDE));
-        expected =  new AbstractCRS(singletonMap(NAME_KEY, "My CRS"),
-                    new AbstractCS (singletonMap(NAME_KEY, "Coordinate system: East (°), North (°), Up (m), Future (d)."),
+        expected =  new AbstractCRS(Map.of(NAME_KEY, "My CRS"),
+                    new AbstractCS (Map.of(NAME_KEY, "Coordinate system: East (°), North (°), Up (m), Future (d)."),
                     HardCodedAxes.GEODETIC_LONGITUDE, HardCodedAxes.GEODETIC_LATITUDE, HardCodedAxes.ALTITUDE, HardCodedAxes.TIME));
         actual   =  toTest.forConvention(AxesConvention.RIGHT_HANDED);
 
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultCompoundCRSTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultCompoundCRSTest.java
index c9321ec24d..bb1d4ef004 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultCompoundCRSTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultCompoundCRSTest.java
@@ -35,7 +35,6 @@ import org.apache.sis.test.DependsOn;
 import org.apache.sis.test.xml.TestCase;
 import org.junit.Test;
 
-import static java.util.Collections.singletonMap;
 import static org.opengis.referencing.crs.CompoundCRS.NAME_KEY;
 import static org.apache.sis.test.ReferencingAssert.*;
 
@@ -133,8 +132,8 @@ public final strictfp class DefaultCompoundCRSTest extends TestCase {
     @Test
     public void testConstructionAndSerialization() {
         final DefaultGeographicCRS crs2 = HardCodedCRS.WGS84;
-        final DefaultCompoundCRS   crs3 = new DefaultCompoundCRS(singletonMap(NAME_KEY, "3D"), crs2, HEIGHT);
-        final DefaultCompoundCRS   crs4 = new DefaultCompoundCRS(singletonMap(NAME_KEY, "4D"), crs3, TIME);
+        final DefaultCompoundCRS   crs3 = new DefaultCompoundCRS(Map.of(NAME_KEY, "3D"), crs2, HEIGHT);
+        final DefaultCompoundCRS   crs4 = new DefaultCompoundCRS(Map.of(NAME_KEY, "4D"), crs3, TIME);
         Validators.validate(crs4);
         /*
          * Verifies the coordinate system axes.
@@ -176,13 +175,13 @@ public final strictfp class DefaultCompoundCRSTest extends TestCase {
     public void testNormalization() {
         final DefaultGeographicCRS crs2 = HardCodedCRS.WGS84_LATITUDE_FIRST;
         final DefaultGeographicCRS rh2  = crs2.forConvention(AxesConvention.RIGHT_HANDED);
-        final DefaultCompoundCRS   crs3 = new DefaultCompoundCRS(singletonMap(NAME_KEY, "3D"), crs2, HEIGHT);
-        final DefaultCompoundCRS   crs4 = new DefaultCompoundCRS(singletonMap(NAME_KEY, "4D"), crs3, TIME);
+        final DefaultCompoundCRS   crs3 = new DefaultCompoundCRS(Map.of(NAME_KEY, "3D"), crs2, HEIGHT);
+        final DefaultCompoundCRS   crs4 = new DefaultCompoundCRS(Map.of(NAME_KEY, "4D"), crs3, TIME);
         final DefaultCompoundCRS   rh4  = crs4.forConvention(AxesConvention.RIGHT_HANDED);
         assertNotSame(crs4, rh4);
         Validators.validate(rh4);
         verifyComponents(crs2, crs3, crs4);
-        verifyComponents(rh2, new DefaultCompoundCRS(singletonMap(NAME_KEY, "3D"), rh2, HEIGHT), rh4);
+        verifyComponents(rh2, new DefaultCompoundCRS(Map.of(NAME_KEY, "3D"), rh2, HEIGHT), rh4);
     }
 
     /**
@@ -191,7 +190,7 @@ public final strictfp class DefaultCompoundCRSTest extends TestCase {
     @Test
     public void testShiftLongitudeRange() {
         final DefaultGeographicCRS crs3 = HardCodedCRS.WGS84_3D;
-        final DefaultCompoundCRS   crs4 = new DefaultCompoundCRS(singletonMap(NAME_KEY, "4D"), crs3, TIME);
+        final DefaultCompoundCRS   crs4 = new DefaultCompoundCRS(Map.of(NAME_KEY, "4D"), crs3, TIME);
         CoordinateSystemAxis axis = crs4.getCoordinateSystem().getAxis(0);
         assertEquals("longitude.minimumValue", -180.0, axis.getMinimumValue(), STRICT);
         assertEquals("longitude.maximumValue", +180.0, axis.getMaximumValue(), STRICT);
@@ -215,13 +214,13 @@ public final strictfp class DefaultCompoundCRSTest extends TestCase {
      */
     @Test
     public void testIsStandardCompliant() {
-        final DefaultCompoundCRS crs3 = new DefaultCompoundCRS(singletonMap(NAME_KEY, "3D"), HardCodedCRS.WGS84,  HEIGHT);
-        final DefaultCompoundCRS crs4 = new DefaultCompoundCRS(singletonMap(NAME_KEY, "4D"), HardCodedCRS.WGS84_3D, TIME);
+        final DefaultCompoundCRS crs3 = new DefaultCompoundCRS(Map.of(NAME_KEY, "3D"), HardCodedCRS.WGS84,  HEIGHT);
+        final DefaultCompoundCRS crs4 = new DefaultCompoundCRS(Map.of(NAME_KEY, "4D"), HardCodedCRS.WGS84_3D, TIME);
         assertTrue (isStandardCompliant(crs3));
         assertTrue (isStandardCompliant(crs4));
-        assertTrue (isStandardCompliant(new DefaultCompoundCRS(singletonMap(NAME_KEY, "4D"), crs3, TIME)));
-        assertFalse(isStandardCompliant(new DefaultCompoundCRS(singletonMap(NAME_KEY, "5D"), crs4, TIME)));
-        assertFalse(isStandardCompliant(new DefaultCompoundCRS(singletonMap(NAME_KEY, "4D"), TIME, crs3)));
+        assertTrue (isStandardCompliant(new DefaultCompoundCRS(Map.of(NAME_KEY, "4D"), crs3, TIME)));
+        assertFalse(isStandardCompliant(new DefaultCompoundCRS(Map.of(NAME_KEY, "5D"), crs4, TIME)));
+        assertFalse(isStandardCompliant(new DefaultCompoundCRS(Map.of(NAME_KEY, "4D"), TIME, crs3)));
     }
 
     /**
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultDerivedCRSTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultDerivedCRSTest.java
index a42100434e..b0eb011097 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultDerivedCRSTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultDerivedCRSTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.referencing.crs;
 
-import java.util.Collections;
+import java.util.Map;
 import javax.xml.bind.JAXBException;
 import org.opengis.referencing.crs.SingleCRS;
 import org.opengis.referencing.cs.AxisDirection;
@@ -105,7 +105,7 @@ public final strictfp class DefaultDerivedCRSTest extends TestCase {
      */
     private static DefaultDerivedCRS createLongitudeRotation() {
         final DefaultConversion conversion = DefaultConversionTest.createLongitudeRotation(false);
-        return new DefaultDerivedCRS(Collections.singletonMap(DefaultDerivedCRS.NAME_KEY, conversion.getTargetCRS().getName()),
+        return new DefaultDerivedCRS(Map.of(DefaultDerivedCRS.NAME_KEY, conversion.getTargetCRS().getName()),
                 (SingleCRS) conversion.getSourceCRS(), conversion, HardCodedCS.GEODETIC_φλ);
     }
 
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultEngineeringCRSTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultEngineeringCRSTest.java
index 0748ff2472..7142b1e352 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultEngineeringCRSTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultEngineeringCRSTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.referencing.crs;
 
-import java.util.Collections;
+import java.util.Map;
 import javax.xml.bind.JAXBException;
 import org.opengis.referencing.cs.CartesianCS;
 import org.opengis.referencing.cs.SphericalCS;
@@ -45,8 +45,8 @@ public final strictfp class DefaultEngineeringCRSTest extends TestCase {
      * Creates an engineering CRS using a two-dimensional Cartesian coordinate system.
      */
     private static DefaultEngineeringCRS createCartesian() {
-        return new DefaultEngineeringCRS(Collections.singletonMap(DefaultEngineeringCRS.NAME_KEY, "A construction site CRS"),
-                new DefaultEngineeringDatum(Collections.singletonMap(DefaultEngineeringDatum.NAME_KEY, "P1")),
+        return new DefaultEngineeringCRS(Map.of(DefaultEngineeringCRS.NAME_KEY, "A construction site CRS"),
+                new DefaultEngineeringDatum(Map.of(DefaultEngineeringDatum.NAME_KEY, "P1")),
                 HardCodedCS.CARTESIAN_2D);
     }
 
@@ -54,8 +54,8 @@ public final strictfp class DefaultEngineeringCRSTest extends TestCase {
      * Creates an engineering CRS using a three-dimensional Spherical coordinate system.
      */
     private static DefaultEngineeringCRS createSpherical() {
-        return new DefaultEngineeringCRS(Collections.singletonMap(DefaultEngineeringCRS.NAME_KEY, "A spherical CRS"),
-                new DefaultEngineeringDatum(Collections.singletonMap(DefaultEngineeringDatum.NAME_KEY, "Centre")),
+        return new DefaultEngineeringCRS(Map.of(DefaultEngineeringCRS.NAME_KEY, "A spherical CRS"),
+                new DefaultEngineeringDatum(Map.of(DefaultEngineeringDatum.NAME_KEY, "Centre")),
                 HardCodedCS.SPHERICAL);
     }
 
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultImageCRSTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultImageCRSTest.java
index 65d7f1df6c..a312a3ea52 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultImageCRSTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultImageCRSTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.referencing.crs;
 
-import java.util.Collections;
+import java.util.Map;
 import javax.xml.bind.JAXBException;
 import org.opengis.referencing.cs.AxisDirection;
 import org.opengis.referencing.cs.AffineCS;
@@ -50,10 +50,10 @@ public final strictfp class DefaultImageCRSTest extends TestCase {
      * @param cartesian {@code true} for a Cartesian coordinate system, or {@code false} for an affine one.
      */
     private static DefaultImageCRS create(final boolean cartesian) {
-        return new DefaultImageCRS(Collections.singletonMap(DefaultImageCRS.NAME_KEY, "An image CRS"),
-                new DefaultImageDatum(Collections.singletonMap(DefaultImageDatum.NAME_KEY, "C1"), PixelInCell.CELL_CENTER),
-                cartesian ? HardCodedCS.GRID : new DefaultAffineCS(
-                        Collections.singletonMap(DefaultAffineCS.NAME_KEY, "Grid"),
+        return new DefaultImageCRS(Map.of(DefaultImageCRS.NAME_KEY, "An image CRS"),
+                new DefaultImageDatum(Map.of(DefaultImageDatum.NAME_KEY, "C1"), PixelInCell.CELL_CENTER),
+                        cartesian ? HardCodedCS.GRID : new DefaultAffineCS(
+                                Map.of(DefaultAffineCS.NAME_KEY, "Grid"),
                                 HardCodedAxes.COLUMN, HardCodedAxes.ROW));
     }
 
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultTemporalCRSTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultTemporalCRSTest.java
index 9559caf219..4b4a918db4 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultTemporalCRSTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultTemporalCRSTest.java
@@ -19,7 +19,7 @@ package org.apache.sis.referencing.crs;
 import java.time.Duration;
 import java.time.Instant;
 import java.util.Date;
-import java.util.Collections;
+import java.util.Map;
 import org.apache.sis.referencing.datum.DefaultTemporalDatum;
 import org.apache.sis.referencing.cs.HardCodedCS;
 import org.apache.sis.io.wkt.Convention;
@@ -105,10 +105,10 @@ public final strictfp class DefaultTemporalCRSTest extends TestCase {
     @Test
     public void testDateConversionWithNanos() {
         final DefaultTemporalDatum datum = new DefaultTemporalDatum(
-                Collections.singletonMap(DefaultTemporalDatum.NAME_KEY, "For test"),
+                Map.of(DefaultTemporalDatum.NAME_KEY, "For test"),
                 new Date(10000L * MILLISECONDS_PER_DAY + 12345));                        // 1997-05-19T00:00:12.345Z
         final DefaultTemporalCRS crs = new DefaultTemporalCRS(
-                Collections.singletonMap(DefaultTemporalCRS.NAME_KEY, datum.getName()),
+                Map.of(DefaultTemporalCRS.NAME_KEY, datum.getName()),
                 datum, HardCodedCS.DAYS);
         /*
          * DefaultTemporalCRS.toSeconds converter should have a non-zero offset because of the 0.345 seconds offset
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/HardCodedCRS.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/HardCodedCRS.java
index 4717314852..4ea60c06ee 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/HardCodedCRS.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/HardCodedCRS.java
@@ -18,7 +18,6 @@ package org.apache.sis.referencing.crs;
 
 import java.util.Map;
 import java.util.HashMap;
-import java.util.Collections;
 import org.opengis.referencing.datum.PixelInCell;
 import org.apache.sis.referencing.cs.HardCodedCS;
 import org.apache.sis.referencing.datum.HardCodedDatum;
@@ -128,7 +127,7 @@ public final strictfp class HardCodedCRS {
      * @since 0.6
      */
     public static final DefaultGeographicCRS NTF = new DefaultGeographicCRS(
-            Collections.singletonMap(DefaultGeographicCRS.NAME_KEY, "NTF (Paris)"),
+            Map.of(DefaultGeographicCRS.NAME_KEY, "NTF (Paris)"),
             HardCodedDatum.NTF, HardCodedCS.ELLIPSOIDAL_gon);
 
     /**
@@ -146,7 +145,7 @@ public final strictfp class HardCodedCRS {
      * @since 0.6
      */
     public static final DefaultGeographicCRS NTF_NORMALIZED_AXES = new DefaultGeographicCRS(
-            Collections.singletonMap(DefaultGeographicCRS.NAME_KEY, NTF.getName()),
+            Map.of(DefaultGeographicCRS.NAME_KEY, NTF.getName()),
             HardCodedDatum.NTF, HardCodedCS.GEODETIC_2D);
 
     /**
@@ -162,7 +161,7 @@ public final strictfp class HardCodedCRS {
      * @since 0.7
      */
     public static final DefaultGeographicCRS TOKYO = new DefaultGeographicCRS(
-            Collections.singletonMap(DefaultGeographicCRS.NAME_KEY, "Tokyo"),
+            Map.of(DefaultGeographicCRS.NAME_KEY, "Tokyo"),
             HardCodedDatum.TOKYO, HardCodedCS.GEODETIC_3D);
 
     /**
@@ -178,7 +177,7 @@ public final strictfp class HardCodedCRS {
      * @since 0.7
      */
     public static final DefaultGeographicCRS JGD2000 = new DefaultGeographicCRS(
-            Collections.singletonMap(DefaultGeographicCRS.NAME_KEY, "JGD2000"),
+            Map.of(DefaultGeographicCRS.NAME_KEY, "JGD2000"),
             HardCodedDatum.JGD2000, HardCodedCS.GEODETIC_3D);
 
     /**
@@ -193,7 +192,7 @@ public final strictfp class HardCodedCRS {
      * @since 1.1
      */
     public static final DefaultGeographicCRS GRS80 = new DefaultGeographicCRS(
-            Collections.singletonMap(DefaultGeographicCRS.NAME_KEY, "Unknown datum based on GRS 1980 ellipsoid"),
+            Map.of(DefaultGeographicCRS.NAME_KEY, "Unknown datum based on GRS 1980 ellipsoid"),
             GeodeticDatumMock.GRS80, HardCodedCS.GEODETIC_2D);
 
     /**
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/AbstractCSTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/AbstractCSTest.java
index 364bb8a125..803787f7cd 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/AbstractCSTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/AbstractCSTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.referencing.cs;
 
+import java.util.Map;
 import org.opengis.referencing.cs.AxisDirection;
 import org.opengis.referencing.cs.CoordinateSystemAxis;
 import org.apache.sis.measure.Units;
@@ -25,7 +26,6 @@ import org.apache.sis.test.DependsOn;
 import org.apache.sis.test.TestCase;
 import org.junit.Test;
 
-import static java.util.Collections.singletonMap;
 import static org.opengis.referencing.cs.CoordinateSystem.NAME_KEY;
 import static org.apache.sis.test.Assert.*;
 
@@ -70,7 +70,7 @@ public final strictfp class AbstractCSTest extends TestCase {
      */
     @Test
     public void testForRightHandedConvention() {
-        final AbstractCS cs = new AbstractCS(singletonMap(NAME_KEY, "Test"),
+        final AbstractCS cs = new AbstractCS(Map.of(NAME_KEY, "Test"),
                 HardCodedAxes.GEODETIC_LATITUDE,
                 HardCodedAxes.TIME,
                 HardCodedAxes.ALTITUDE,
@@ -100,10 +100,10 @@ public final strictfp class AbstractCSTest extends TestCase {
          * We verify the properties inferred by the constructor as a matter of principle, even
          * if it is not really the purpose of this test.
          */
-        final DefaultCoordinateSystemAxis EASTING = new DefaultCoordinateSystemAxis(
-                singletonMap(NAME_KEY, Vocabulary.format(Vocabulary.Keys.Unnamed)), "E", AxisDirection.EAST, Units.METRE);
-        final DefaultCoordinateSystemAxis HEIGHT = new DefaultCoordinateSystemAxis(
-                singletonMap(NAME_KEY, "Height"), "h", AxisDirection.UP, Units.METRE);
+        final var EASTING = new DefaultCoordinateSystemAxis(
+                Map.of(NAME_KEY, Vocabulary.format(Vocabulary.Keys.Unnamed)), "E", AxisDirection.EAST, Units.METRE);
+        final var HEIGHT = new DefaultCoordinateSystemAxis(
+                Map.of(NAME_KEY, "Height"), "h", AxisDirection.UP, Units.METRE);
         assertEquals("minimumValue", Double.NEGATIVE_INFINITY, EASTING.getMinimumValue(), STRICT);
         assertEquals("maximumValue", Double.POSITIVE_INFINITY, EASTING.getMaximumValue(), STRICT);
         assertNull  ("rangeMeaning", EASTING.getRangeMeaning());
@@ -114,7 +114,7 @@ public final strictfp class AbstractCSTest extends TestCase {
          * Now the actual test. First we opportunistically test RIGHT_HANDED and DISPLAY_ORIENTED
          * before to test NORMALIZED, in order to test in increasing complexity.
          */
-        final AbstractCS cs = new AbstractCS(singletonMap(NAME_KEY, "Test"),
+        final AbstractCS cs = new AbstractCS(Map.of(NAME_KEY, "Test"),
                 HardCodedAxes.TIME,
                 HardCodedAxes.NORTHING,
                 HardCodedAxes.WESTING,
@@ -142,7 +142,7 @@ public final strictfp class AbstractCSTest extends TestCase {
      */
     @Test
     public void testForPositiveRangeConvention() {
-        final AbstractCS cs = new AbstractCS(singletonMap(NAME_KEY, "Test"),
+        final AbstractCS cs = new AbstractCS(Map.of(NAME_KEY, "Test"),
                 HardCodedAxes.GEODETIC_LONGITUDE, HardCodedAxes.GEODETIC_LATITUDE);
         verifyAxesConvention(AxesConvention.POSITIVE_RANGE, cs,
                 HardCodedAxes.SHIFTED_LONGITUDE, HardCodedAxes.GEODETIC_LATITUDE);
@@ -153,7 +153,7 @@ public final strictfp class AbstractCSTest extends TestCase {
      */
     @Test
     public void testSerialization() {
-        final AbstractCS cs = new AbstractCS(singletonMap(NAME_KEY, "Test"), HardCodedAxes.X, HardCodedAxes.Y);
+        final AbstractCS cs = new AbstractCS(Map.of(NAME_KEY, "Test"), HardCodedAxes.X, HardCodedAxes.Y);
         assertNotSame(cs, assertSerializedEquals(cs));
     }
 }
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/CoordinateSystemsTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/CoordinateSystemsTest.java
index cc4dbc864a..a21b11503c 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/CoordinateSystemsTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/CoordinateSystemsTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.referencing.cs;
 
+import java.util.Map;
 import java.util.Locale;
 import javax.measure.Unit;
 import javax.measure.IncommensurableException;
@@ -36,7 +37,6 @@ import org.apache.sis.test.TestCase;
 import org.junit.Test;
 
 import static java.lang.Double.NaN;
-import static java.util.Collections.singletonMap;
 import static org.opengis.referencing.IdentifiedObject.NAME_KEY;
 import static org.apache.sis.referencing.IdentifiedObjects.getProperties;
 import static org.apache.sis.referencing.cs.CoordinateSystems.*;
@@ -181,10 +181,10 @@ public final strictfp class CoordinateSystemsTest extends TestCase {
      */
     @Test
     public void testSwapAndScaleAxes2D() throws IncommensurableException {
-        final CoordinateSystem λφ = new DefaultEllipsoidalCS(singletonMap(NAME_KEY, "(λ,φ)"),
+        final CoordinateSystem λφ = new DefaultEllipsoidalCS(Map.of(NAME_KEY, "(λ,φ)"),
                 HardCodedAxes.GEODETIC_LONGITUDE,
                 HardCodedAxes.GEODETIC_LATITUDE);
-        final CoordinateSystem φλ = new DefaultEllipsoidalCS(singletonMap(NAME_KEY, "(φ,λ)"),
+        final CoordinateSystem φλ = new DefaultEllipsoidalCS(Map.of(NAME_KEY, "(φ,λ)"),
                 HardCodedAxes.GEODETIC_LATITUDE,
                 HardCodedAxes.GEODETIC_LONGITUDE);
         final Matrix expected = Matrices.create(3, 3, new double[] {
@@ -206,11 +206,11 @@ public final strictfp class CoordinateSystemsTest extends TestCase {
     @Test
     @DependsOnMethod("testSwapAndScaleAxes2D")
     public void testSwapAndScaleAxes3D() throws IncommensurableException {
-        final CoordinateSystem λφh = new DefaultEllipsoidalCS(singletonMap(NAME_KEY, "(λ,φ,h)"),
+        final CoordinateSystem λφh = new DefaultEllipsoidalCS(Map.of(NAME_KEY, "(λ,φ,h)"),
                 HardCodedAxes.GEODETIC_LONGITUDE,
                 HardCodedAxes.GEODETIC_LATITUDE,
                 HardCodedAxes.ELLIPSOIDAL_HEIGHT);
-        final CoordinateSystem φλh = new DefaultEllipsoidalCS(singletonMap(NAME_KEY, "(φ,λ,h)"),
+        final CoordinateSystem φλh = new DefaultEllipsoidalCS(Map.of(NAME_KEY, "(φ,λ,h)"),
                 HardCodedAxes.GEODETIC_LATITUDE,
                 HardCodedAxes.GEODETIC_LONGITUDE,
                 HardCodedAxes.ELLIPSOIDAL_HEIGHT);
@@ -234,11 +234,11 @@ public final strictfp class CoordinateSystemsTest extends TestCase {
     @Test
     @DependsOnMethod("testSwapAndScaleAxes3D")
     public void testSwapAndScaleAxes() throws IncommensurableException {
-        final CoordinateSystem hxy = new DefaultCartesianCS(singletonMap(NAME_KEY, "(h,x,y)"),
+        final CoordinateSystem hxy = new DefaultCartesianCS(Map.of(NAME_KEY, "(h,x,y)"),
                 HardCodedAxes.HEIGHT_cm,
                 HardCodedAxes.EASTING,
                 HardCodedAxes.NORTHING);
-        final CoordinateSystem yxh = new DefaultCartesianCS(singletonMap(NAME_KEY, "(y,x,h)"),
+        final CoordinateSystem yxh = new DefaultCartesianCS(Map.of(NAME_KEY, "(y,x,h)"),
                 HardCodedAxes.SOUTHING,
                 HardCodedAxes.EASTING,
                 HardCodedAxes.DEPTH);
@@ -265,7 +265,7 @@ public final strictfp class CoordinateSystemsTest extends TestCase {
     @Test
     @DependsOnMethod("testSwapAndScaleAxes")
     public void testScaleAndSwapAxesNonSquare() throws IncommensurableException {
-        final DefaultCartesianCS cs = new DefaultCartesianCS(singletonMap(NAME_KEY, "Test"),
+        final var cs = new DefaultCartesianCS(Map.of(NAME_KEY, "Test"),
                 new DefaultCoordinateSystemAxis(getProperties(HardCodedAxes.SOUTHING), "y", AxisDirection.SOUTH, Units.CENTIMETRE),
                 new DefaultCoordinateSystemAxis(getProperties(HardCodedAxes.EASTING),  "x", AxisDirection.EAST,  Units.MILLIMETRE));
 
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultCartesianCSTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultCartesianCSTest.java
index d918df8fac..015d554230 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultCartesianCSTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultCartesianCSTest.java
@@ -28,7 +28,6 @@ import org.apache.sis.test.DependsOn;
 import org.apache.sis.test.DependsOnMethod;
 import org.junit.Test;
 
-import static java.util.Collections.singletonMap;
 import static org.opengis.referencing.IdentifiedObject.NAME_KEY;
 import static org.apache.sis.test.TestUtilities.getSingleton;
 import static org.apache.sis.test.ReferencingAssert.*;
@@ -57,7 +56,7 @@ public final strictfp class DefaultCartesianCSTest extends TestCase {
      */
     @Test
     public void testConstructor() {
-        final Map<String,?> properties = singletonMap(DefaultCartesianCS.NAME_KEY, "Test");
+        final Map<String,?> properties = Map.of(DefaultCartesianCS.NAME_KEY, "Test");
         DefaultCartesianCS cs;
         /*
          * (E,N) : legal axes for the usual projected CRS.
@@ -87,7 +86,7 @@ public final strictfp class DefaultCartesianCSTest extends TestCase {
      */
     @Test
     public void testConstructorArgumentChecks() {
-        final Map<String,?> properties = singletonMap(DefaultCartesianCS.NAME_KEY, "Test");
+        final Map<String,?> properties = Map.of(DefaultCartesianCS.NAME_KEY, "Test");
         /*
          * (λ,φ) : illegal units.
          */
@@ -131,7 +130,7 @@ public final strictfp class DefaultCartesianCSTest extends TestCase {
         if (c.equals(AxisDirection.EAST))  return HardCodedAxes.EASTING;
         if (c.equals(AxisDirection.SOUTH)) return HardCodedAxes.SOUTHING;
         if (c.equals(AxisDirection.WEST))  return HardCodedAxes.WESTING;
-        return new DefaultCoordinateSystemAxis(singletonMap(NAME_KEY, c.name()), "?", c, Units.METRE);
+        return new DefaultCoordinateSystemAxis(Map.of(NAME_KEY, c.name()), "?", c, Units.METRE);
     }
 
     /**
@@ -144,7 +143,7 @@ public final strictfp class DefaultCartesianCSTest extends TestCase {
         final DefaultCoordinateSystemAxis xAxis = createAxis(x);
         final DefaultCoordinateSystemAxis yAxis = createAxis(y);
         final String name = xAxis.getName().getCode() + ", " + yAxis.getName().getCode();
-        return new DefaultCartesianCS(singletonMap(NAME_KEY, name), xAxis, yAxis);
+        return new DefaultCartesianCS(Map.of(NAME_KEY, name), xAxis, yAxis);
     }
 
     /**
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultCompoundCSTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultCompoundCSTest.java
index 2b1522cfa2..9ad5fe20d7 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultCompoundCSTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultCompoundCSTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.referencing.cs;
 
-import java.util.Collections;
+import java.util.Map;
 import org.apache.sis.test.DependsOn;
 import org.apache.sis.test.TestCase;
 import org.junit.Test;
@@ -41,8 +41,7 @@ public final strictfp class DefaultCompoundCSTest extends TestCase {
     public void testConstruction() {
         final DefaultCompoundCS cs = new DefaultCompoundCS(
                 HardCodedCS.PROJECTED,
-                new DefaultVerticalCS(Collections.singletonMap(DefaultVerticalCS.NAME_KEY,
-                        HardCodedAxes.HEIGHT_cm.getName()), HardCodedAxes.HEIGHT_cm),
+                new DefaultVerticalCS(Map.of(DefaultVerticalCS.NAME_KEY, HardCodedAxes.HEIGHT_cm.getName()), HardCodedAxes.HEIGHT_cm),
                 HardCodedCS.DAYS
         );
         assertEquals("Compound CS: East (m), North (m), Up (cm), Future (d).", cs.getName().getCode());
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultCoordinateSystemAxisTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultCoordinateSystemAxisTest.java
index 75b766352a..93c574db19 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultCoordinateSystemAxisTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultCoordinateSystemAxisTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.referencing.cs;
 
+import java.util.Map;
 import org.opengis.referencing.cs.AxisDirection;
 import org.opengis.referencing.cs.RangeMeaning;
 import org.opengis.test.Validators;
@@ -27,7 +28,6 @@ import org.apache.sis.test.DependsOn;
 import org.apache.sis.test.TestCase;
 import org.junit.Test;
 
-import static java.util.Collections.singletonMap;
 import static org.apache.sis.test.ReferencingAssert.*;
 import static org.apache.sis.referencing.cs.HardCodedAxes.*;
 import static org.apache.sis.referencing.IdentifiedObjects.getProperties;
@@ -116,7 +116,7 @@ public final strictfp class DefaultCoordinateSystemAxisTest extends TestCase {
     @DependsOnMethod("testWKT")
     public void testMeridianWKT() {
         assertWktEquals("AXIS[“South along 90°W (x)”, south, MERIDIAN[-90.0, ANGLEUNIT[“degree”, 0.017453292519943295]], LENGTHUNIT[“metre”, 1]]",
-                new DefaultCoordinateSystemAxis(singletonMap(DefaultCoordinateSystemAxis.NAME_KEY, "South along 90°W"),
+                new DefaultCoordinateSystemAxis(Map.of(DefaultCoordinateSystemAxis.NAME_KEY, "South along 90°W"),
                         "x", new DirectionAlongMeridian(AxisDirection.SOUTH, -90).getDirection(), Units.METRE));
     }
 
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultCylindricalCSTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultCylindricalCSTest.java
index c3ad4ef246..a9b48802ac 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultCylindricalCSTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultCylindricalCSTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.referencing.cs;
 
-import java.util.Collections;
+import java.util.Map;
 import org.opengis.referencing.cs.AxisDirection;
 import org.opengis.referencing.cs.RangeMeaning;
 import org.apache.sis.internal.referencing.AxisDirections;
@@ -63,7 +63,7 @@ public final strictfp class DefaultCylindricalCSTest extends TestCase {
                 AxisDirection.SOUTH, Units.METRE, 0, Double.POSITIVE_INFINITY, RangeMeaning.EXACT);
 
         final DefaultCylindricalCS cs = new DefaultCylindricalCS(
-                Collections.singletonMap(DefaultCylindricalCS.NAME_KEY, "Cylindrical"),
+                Map.of(DefaultCylindricalCS.NAME_KEY, "Cylindrical"),
                 HardCodedAxes.BEARING,
                 HardCodedAxes.Z,
                 radius);
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultPolarCSTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultPolarCSTest.java
index 3a2584c7e6..34aa638bf2 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultPolarCSTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultPolarCSTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.referencing.cs;
 
-import java.util.Collections;
+import java.util.Map;
 import org.opengis.referencing.cs.AxisDirection;
 import org.opengis.referencing.cs.RangeMeaning;
 import org.apache.sis.internal.referencing.AxisDirections;
@@ -62,7 +62,7 @@ public final strictfp class DefaultPolarCSTest extends TestCase {
                 AxisDirection.SOUTH, Units.METRE, 0, Double.POSITIVE_INFINITY, RangeMeaning.EXACT);
 
         final DefaultPolarCS cs = new DefaultPolarCS(
-                Collections.singletonMap(DefaultPolarCS.NAME_KEY, "Polar"),
+                Map.of(DefaultPolarCS.NAME_KEY, "Polar"),
                 HardCodedAxes.BEARING,
                 radius);
 
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultSphericalCSTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultSphericalCSTest.java
index 1b994f68e0..c272368d68 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultSphericalCSTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/DefaultSphericalCSTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.referencing.cs;
 
-import java.util.Collections;
+import java.util.Map;
 import org.opengis.referencing.cs.AxisDirection;
 import org.apache.sis.internal.referencing.AxisDirections;
 import org.apache.sis.test.TestCase;
@@ -59,7 +59,7 @@ public final strictfp class DefaultSphericalCSTest extends TestCase {
                 AxisDirection.UP);
 
         assertEquals(new DefaultSphericalCS(
-                Collections.singletonMap(AbstractCS.NAME_KEY, "Spherical CS: East (°), North (°), Up (m)."),
+                Map.of(AbstractCS.NAME_KEY, "Spherical CS: East (°), North (°), Up (m)."),
                 HardCodedAxes.SPHERICAL_LONGITUDE,
                 HardCodedAxes.SPHERICAL_LATITUDE,
                 HardCodedAxes.GEOCENTRIC_RADIUS), normalized);
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/HardCodedCS.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/HardCodedCS.java
index c5ecf4c95c..a3ba08aaa0 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/HardCodedCS.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/HardCodedCS.java
@@ -20,7 +20,6 @@ import java.util.Map;
 import org.opengis.referencing.cs.AxisDirection;
 import org.apache.sis.measure.Units;
 
-import static java.util.Collections.singletonMap;
 import static org.opengis.referencing.IdentifiedObject.NAME_KEY;
 import static org.apache.sis.referencing.IdentifiedObjects.getProperties;
 
@@ -41,7 +40,7 @@ public final strictfp class HardCodedCS {
      * axes in decimal degrees.
      */
     public static final DefaultEllipsoidalCS GEODETIC_φλ = new DefaultEllipsoidalCS(
-            singletonMap(NAME_KEY, "Geodetic 2D (φ,λ)"),
+            Map.of(NAME_KEY, "Geodetic 2D (φ,λ)"),
             HardCodedAxes.GEODETIC_LATITUDE,
             HardCodedAxes.GEODETIC_LONGITUDE);
 
@@ -52,7 +51,7 @@ public final strictfp class HardCodedCS {
      * axes in decimal degrees.
      */
     public static final DefaultEllipsoidalCS GEODETIC_2D = new DefaultEllipsoidalCS(
-            singletonMap(NAME_KEY, "Geodetic 2D"),
+            Map.of(NAME_KEY, "Geodetic 2D"),
             HardCodedAxes.GEODETIC_LONGITUDE,
             HardCodedAxes.GEODETIC_LATITUDE);
 
@@ -64,7 +63,7 @@ public final strictfp class HardCodedCS {
      * axes.
      */
     public static final DefaultEllipsoidalCS GEODETIC_3D = new DefaultEllipsoidalCS(
-            singletonMap(NAME_KEY, "Geodetic 3D"),
+            Map.of(NAME_KEY, "Geodetic 3D"),
             HardCodedAxes.GEODETIC_LONGITUDE,
             HardCodedAxes.GEODETIC_LATITUDE,
             HardCodedAxes.ELLIPSOIDAL_HEIGHT);
@@ -78,7 +77,7 @@ public final strictfp class HardCodedCS {
      * <p>This coordinate system is used for testing unit conversions without axes swapping.</p>
      */
     public static final DefaultEllipsoidalCS ELLIPSOIDAL_gon = new DefaultEllipsoidalCS(
-            singletonMap(NAME_KEY, "Ellipsoidal (gon)"),
+            Map.of(NAME_KEY, "Ellipsoidal (gon)"),
             HardCodedAxes.LONGITUDE_gon,
             HardCodedAxes.LATITUDE_gon);
 
@@ -93,7 +92,7 @@ public final strictfp class HardCodedCS {
      * @see #SPHERICAL_ENGINEERING
      */
     public static final DefaultSphericalCS SPHERICAL = new DefaultSphericalCS(
-            singletonMap(NAME_KEY, "Spherical"),
+            Map.of(NAME_KEY, "Spherical"),
             HardCodedAxes.SPHERICAL_LATITUDE,
             HardCodedAxes.SPHERICAL_LONGITUDE,
             HardCodedAxes.GEOCENTRIC_RADIUS);
@@ -105,7 +104,7 @@ public final strictfp class HardCodedCS {
      * <var>{@linkplain HardCodedAxes#ELEVATION elevation}</var> axes.
      */
     public static final DefaultSphericalCS SPHERICAL_ENGINEERING = new DefaultSphericalCS(
-            singletonMap(NAME_KEY, SPHERICAL.getName()),
+            Map.of(NAME_KEY, SPHERICAL.getName()),
             HardCodedAxes.DISTANCE,
             HardCodedAxes.BEARING,
             HardCodedAxes.ELEVATION);
@@ -118,7 +117,7 @@ public final strictfp class HardCodedCS {
      * axes in metres.
      */
     public static final DefaultCartesianCS GEOCENTRIC = new DefaultCartesianCS(
-            singletonMap(NAME_KEY, "Geocentric"),
+            Map.of(NAME_KEY, "Geocentric"),
             HardCodedAxes.GEOCENTRIC_X,
             HardCodedAxes.GEOCENTRIC_Y,
             HardCodedAxes.GEOCENTRIC_Z);
@@ -133,7 +132,7 @@ public final strictfp class HardCodedCS {
      * @since 0.7
      */
     public static final DefaultCylindricalCS CYLINDRICAL = new DefaultCylindricalCS(
-            singletonMap(NAME_KEY, "Cylindrical"),
+            Map.of(NAME_KEY, "Cylindrical"),
             HardCodedAxes.DISTANCE,
             HardCodedAxes.BEARING,
             HardCodedAxes.Z);
@@ -147,7 +146,7 @@ public final strictfp class HardCodedCS {
      * @since 0.7
      */
     public static final DefaultPolarCS POLAR = new DefaultPolarCS(
-            singletonMap(NAME_KEY, "Polar"),
+            Map.of(NAME_KEY, "Polar"),
             HardCodedAxes.DISTANCE,
             HardCodedAxes.BEARING);
 
@@ -158,7 +157,7 @@ public final strictfp class HardCodedCS {
      * axes in metres.
      */
     public static final DefaultCartesianCS PROJECTED = new DefaultCartesianCS(
-            singletonMap(NAME_KEY, "Projected"),
+            Map.of(NAME_KEY, "Projected"),
             HardCodedAxes.EASTING,
             HardCodedAxes.NORTHING);
 
@@ -170,7 +169,7 @@ public final strictfp class HardCodedCS {
      * axes in metres.
      */
     public static final DefaultCartesianCS PROJECTED_3D = new DefaultCartesianCS(
-            singletonMap(NAME_KEY, "Projected"),
+            Map.of(NAME_KEY, "Projected"),
             HardCodedAxes.EASTING,
             HardCodedAxes.NORTHING,
             HardCodedAxes.ELLIPSOIDAL_HEIGHT);
@@ -182,7 +181,7 @@ public final strictfp class HardCodedCS {
      * axes in metres.
      */
     public static final DefaultCartesianCS CARTESIAN_2D = new DefaultCartesianCS(
-            singletonMap(NAME_KEY, "Cartesian 2D"),
+            Map.of(NAME_KEY, "Cartesian 2D"),
             HardCodedAxes.X,
             HardCodedAxes.Y);
 
@@ -194,7 +193,7 @@ public final strictfp class HardCodedCS {
      * axes in metres.
      */
     public static final DefaultCartesianCS CARTESIAN_3D = new DefaultCartesianCS(
-            singletonMap(NAME_KEY, "Cartesian 3D"),
+            Map.of(NAME_KEY, "Cartesian 3D"),
             HardCodedAxes.X,
             HardCodedAxes.Y,
             HardCodedAxes.Z);
@@ -206,7 +205,7 @@ public final strictfp class HardCodedCS {
      * axes.
      */
     public static final DefaultCartesianCS GRID = new DefaultCartesianCS(
-            singletonMap(NAME_KEY, "Grid"),
+            Map.of(NAME_KEY, "Grid"),
             HardCodedAxes.COLUMN,
             HardCodedAxes.ROW);
 
@@ -217,7 +216,7 @@ public final strictfp class HardCodedCS {
      * axes.
      */
     public static final DefaultCartesianCS DISPLAY = new DefaultCartesianCS(
-            singletonMap(NAME_KEY, "Display"),
+            Map.of(NAME_KEY, "Display"),
             HardCodedAxes.DISPLAY_X,
             HardCodedAxes.DISPLAY_Y);
 
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/NormalizerTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/NormalizerTest.java
index 3a03c4b5fe..fcc07b9b36 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/NormalizerTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/NormalizerTest.java
@@ -19,7 +19,6 @@ package org.apache.sis.referencing.cs;
 import java.util.Map;
 import java.util.Arrays;
 import java.util.HashMap;
-import java.util.Collections;
 import org.opengis.referencing.cs.AxisDirection;
 import org.opengis.referencing.cs.CoordinateSystemAxis;
 import org.apache.sis.referencing.ImmutableIdentifier;
@@ -30,7 +29,6 @@ import org.apache.sis.test.DependsOn;
 import org.apache.sis.test.TestCase;
 import org.junit.Test;
 
-import static java.util.Collections.singletonMap;
 import static org.opengis.referencing.cs.CoordinateSystem.NAME_KEY;
 import static org.apache.sis.test.ReferencingAssert.*;
 
@@ -170,7 +168,7 @@ public final strictfp class NormalizerTest extends TestCase {
      * Creates axes from the specified directions.
      */
     private static CoordinateSystemAxis[] toAxes(final AxisDirection[] directions) {
-        final Map<String,?> properties = singletonMap(NAME_KEY, "Temporary axis");
+        final Map<String,?> properties = Map.of(NAME_KEY, "Temporary axis");
         final CoordinateSystemAxis[] axis = new CoordinateSystemAxis[directions.length];
         for (int i=0; i<directions.length; i++) {
             axis[i] = new DefaultCoordinateSystemAxis(properties, "none", directions[i], Units.METRE);
@@ -230,7 +228,7 @@ public final strictfp class NormalizerTest extends TestCase {
     @Test
     public void testNormalize() {
         final DefaultEllipsoidalCS cs = new DefaultEllipsoidalCS(
-                Collections.singletonMap(DefaultEllipsoidalCS.NAME_KEY, "lat lon height"),
+                Map.of(DefaultEllipsoidalCS.NAME_KEY, "lat lon height"),
                 HardCodedAxes.GEODETIC_LATITUDE,
                 HardCodedAxes.GEODETIC_LONGITUDE,
                 HardCodedAxes.ELLIPSOIDAL_HEIGHT);
@@ -253,7 +251,7 @@ public final strictfp class NormalizerTest extends TestCase {
     @Test
     public void testIdentifierRemoval() {
         final DefaultEllipsoidalCS cs = new DefaultEllipsoidalCS(           // EPSG::6423
-                Collections.singletonMap(DefaultEllipsoidalCS.NAME_KEY, "lat lon height"),
+                Map.of(DefaultEllipsoidalCS.NAME_KEY, "lat lon height"),
                 addIdentifier(HardCodedAxes.GEODETIC_LATITUDE,  (short) 108),
                 addIdentifier(HardCodedAxes.GEODETIC_LONGITUDE, (short) 109),
                 addIdentifier(HardCodedAxes.ELLIPSOIDAL_HEIGHT, (short) 110));
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/datum/DefaultPrimeMeridianTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/datum/DefaultPrimeMeridianTest.java
index fa2745d0c2..d49c456f4b 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/datum/DefaultPrimeMeridianTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/datum/DefaultPrimeMeridianTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.referencing.datum;
 
+import java.util.Map;
 import javax.measure.quantity.Angle;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
@@ -32,7 +33,6 @@ import org.apache.sis.test.DependsOnMethod;
 import org.apache.sis.test.DependsOn;
 import org.junit.Test;
 
-import static java.util.Collections.singletonMap;
 import static org.apache.sis.test.ReferencingAssert.*;
 import static org.apache.sis.referencing.GeodeticObjectVerifier.*;
 
@@ -87,7 +87,8 @@ public final strictfp class DefaultPrimeMeridianTest extends TestCase {
     @Test
     @DependsOnMethod("testWKT_inGrads")
     public void testWKT_withUnformattableUnit() {
-        final DefaultPrimeMeridian pm = new DefaultPrimeMeridian(singletonMap(DefaultPrimeMeridian.NAME_KEY, "Test"),
+        final DefaultPrimeMeridian pm = new DefaultPrimeMeridian(
+                Map.of(DefaultPrimeMeridian.NAME_KEY, "Test"),
                 10.3, Units.valueOfEPSG(9111).asType(Angle.class));
         /*
          * In WKT 1 format, if there is no contextual unit (which is the case of this test),
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/datum/DefaultVerticalDatumTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/datum/DefaultVerticalDatumTest.java
index 4917e7db4b..6be90479d2 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/datum/DefaultVerticalDatumTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/datum/DefaultVerticalDatumTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.referencing.datum;
 
+import java.util.Map;
 import java.lang.reflect.Field;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
@@ -30,7 +31,6 @@ import org.apache.sis.xml.MarshallerPool;
 import org.apache.sis.test.xml.TestCase;
 import org.junit.Test;
 
-import static java.util.Collections.singletonMap;
 import static org.apache.sis.test.ReferencingAssert.*;
 import static org.apache.sis.referencing.GeodeticObjectVerifier.*;
 
@@ -75,8 +75,9 @@ public final strictfp class DefaultVerticalDatumTest extends TestCase {
      * Returns the vertical datum type inferred by {@link DefaultVerticalDatum} for the given name.
      */
     private static VerticalDatumType typeForName(final Field typeField, final String name) throws IllegalAccessException {
-        final DefaultVerticalDatum datum = new DefaultVerticalDatum(
-                singletonMap(DefaultVerticalDatum.NAME_KEY, name), VerticalDatumType.OTHER_SURFACE);
+        final var datum = new DefaultVerticalDatum(
+                Map.of(DefaultVerticalDatum.NAME_KEY, name),
+                VerticalDatumType.OTHER_SURFACE);
         typeField.set(datum, null);
         return datum.getVerticalDatumType();
     }
@@ -87,12 +88,12 @@ public final strictfp class DefaultVerticalDatumTest extends TestCase {
     @Test
     public void testToWKT() {
         DefaultVerticalDatum datum;
-        datum = new DefaultVerticalDatum(singletonMap(DefaultVerticalDatum.NAME_KEY, "Geoidal"), VerticalDatumType.GEOIDAL);
+        datum = new DefaultVerticalDatum(Map.of(DefaultVerticalDatum.NAME_KEY, "Geoidal"), VerticalDatumType.GEOIDAL);
         assertWktEquals(Convention.WKT1, "VERT_DATUM[“Geoidal”, 2005]", datum);
         assertWktEquals(Convention.WKT2, "VDATUM[“Geoidal”]", datum);
         assertWktEquals(Convention.WKT2_SIMPLIFIED, "VerticalDatum[“Geoidal”]", datum);
 
-        datum = new DefaultVerticalDatum(singletonMap(DefaultVerticalDatum.NAME_KEY, "Ellipsoidal"), VerticalDatumTypes.ELLIPSOIDAL);
+        datum = new DefaultVerticalDatum(Map.of(DefaultVerticalDatum.NAME_KEY, "Ellipsoidal"), VerticalDatumTypes.ELLIPSOIDAL);
         assertWktEquals(Convention.WKT1, "VERT_DATUM[“Ellipsoidal”, 2002]", datum);
         assertWktEquals(Convention.WKT2, "VDATUM[“Ellipsoidal”]", datum);
         assertWktEquals(Convention.WKT2_SIMPLIFIED, "VerticalDatum[“Ellipsoidal”]", datum);
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/GeodeticObjectFactoryTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/GeodeticObjectFactoryTest.java
index ce221099cb..53ee66cd70 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/GeodeticObjectFactoryTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/GeodeticObjectFactoryTest.java
@@ -17,7 +17,6 @@
 package org.apache.sis.referencing.factory;
 
 import java.util.Map;
-import java.util.Collections;
 import javax.measure.Unit;
 import javax.measure.quantity.Angle;
 import javax.measure.quantity.Length;
@@ -143,7 +142,7 @@ public final strictfp class GeodeticObjectFactoryTest extends ObjectFactoryTest
      * This is the only mandatory property for object creation.
      */
     private static Map<String,?> name(final String name) {
-        return Collections.singletonMap(IdentifiedObject.NAME_KEY, name);
+        return Map.of(IdentifiedObject.NAME_KEY, name);
     }
 
     /**
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/IdentifiedObjectFinderTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/IdentifiedObjectFinderTest.java
index 3baf8bd64d..6c62129557 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/IdentifiedObjectFinderTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/IdentifiedObjectFinderTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.referencing.factory;
 
-import java.util.Collections;
+import java.util.Map;
 import org.opengis.util.FactoryException;
 import org.opengis.referencing.IdentifiedObject;
 import org.opengis.referencing.crs.CRSAuthorityFactory;
@@ -80,7 +80,7 @@ public final strictfp class IdentifiedObjectFinderTest extends TestCase {
          * The intent is to force a full scan.
          */
         final CoordinateReferenceSystem search = new DefaultGeographicCRS(
-                Collections.singletonMap(DefaultGeographicCRS.NAME_KEY, CRS84.getName()),
+                Map.of(DefaultGeographicCRS.NAME_KEY, CRS84.getName()),
                 CRS84.getDatum(), CRS84.getCoordinateSystem());
         assertEqualsIgnoreMetadata(CRS84, search);              // Required condition for next test.
 
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/sql/epsg/DataScriptFormatter.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/sql/epsg/DataScriptFormatter.java
index aecfb1cec4..a7826b8ebe 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/sql/epsg/DataScriptFormatter.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/sql/epsg/DataScriptFormatter.java
@@ -18,7 +18,6 @@ package org.apache.sis.referencing.factory.sql.epsg;
 
 import java.util.Map;
 import java.util.HashMap;
-import java.util.Collections;
 import java.util.function.UnaryOperator;
 import java.io.LineNumberReader;
 import java.io.InputStreamReader;
@@ -157,7 +156,7 @@ public final class DataScriptFormatter extends ScriptRunner {
         m.put("epsg_primemeridian",                lastColumn );
         m.put("epsg_unitofmeasure",                lastColumn );
         booleanColumnIndicesForTables = m;
-        doubleColumnIndicesForTables = Collections.singletonMap("epsg_coordoperationparamvalue", new int[] {2});
+        doubleColumnIndicesForTables = Map.of("epsg_coordoperationparamvalue", new int[] {2});
     }
 
     /**
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationFinderTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationFinderTest.java
index 52c6d19d0a..cbfb56a029 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationFinderTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationFinderTest.java
@@ -19,7 +19,6 @@ package org.apache.sis.referencing.operation;
 import java.util.Set;
 import java.util.Map;
 import java.util.HashMap;
-import java.util.Collections;
 import java.text.ParseException;
 import org.opengis.util.FactoryException;
 import org.opengis.parameter.ParameterValueGroup;
@@ -901,7 +900,7 @@ public final strictfp class CoordinateOperationFinderTest extends MathTransformT
      * This is a convenience method for construction of geodetic objects.
      */
     private static Map<String,String> properties(final String name) {
-        return Collections.singletonMap(CoordinateReferenceSystem.NAME_KEY, name);
+        return Map.of(CoordinateReferenceSystem.NAME_KEY, name);
     }
 
     /**
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/DefaultConcatenatedOperationTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/DefaultConcatenatedOperationTest.java
index a8de4ad720..52d0e088af 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/DefaultConcatenatedOperationTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/DefaultConcatenatedOperationTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.referencing.operation;
 
-import java.util.Collections;
+import java.util.Map;
 import javax.xml.bind.JAXBException;
 import org.opengis.util.FactoryException;
 import org.opengis.referencing.crs.GeodeticCRS;
@@ -66,16 +66,16 @@ public final strictfp class DefaultConcatenatedOperationTest extends TestCase {
         final MathTransformFactory mtFactory = DefaultFactories.forBuildin(MathTransformFactory.class);
         final DefaultTransformation op = DefaultTransformationTest.createGeocentricTranslation();
 
-        final DefaultConversion before = new DefaultConversion(
-                Collections.singletonMap(DefaultConversion.NAME_KEY, "Geographic to geocentric"),
+        final var before = new DefaultConversion(
+                Map.of(DefaultConversion.NAME_KEY, "Geographic to geocentric"),
                 HardCodedCRS.TOKYO,             // SourceCRS
                 op.getSourceCRS(),              // TargetCRS
                 null,                           // InterpolationCRS
                 DefaultOperationMethodTest.create("Geographic/geocentric conversions", "9602", "EPSG guidance note #7-2", 3),
                 EllipsoidToCentricTransform.createGeodeticConversion(mtFactory, HardCodedDatum.TOKYO.getEllipsoid(), true));
 
-        final DefaultConversion after = new DefaultConversion(
-                Collections.singletonMap(DefaultConversion.NAME_KEY, "Geocentric to geographic"),
+        final var after = new DefaultConversion(
+                Map.of(DefaultConversion.NAME_KEY, "Geocentric to geographic"),
                 op.getTargetCRS(),              // SourceCRS
                 HardCodedCRS.JGD2000,           // TargetCRS
                 null,                           // InterpolationCRS
@@ -83,7 +83,7 @@ public final strictfp class DefaultConcatenatedOperationTest extends TestCase {
                 EllipsoidToCentricTransform.createGeodeticConversion(mtFactory, HardCodedDatum.JGD2000.getEllipsoid(), true).inverse());
 
         return new DefaultConcatenatedOperation(
-                Collections.singletonMap(DefaultConversion.NAME_KEY, "Tokyo to JGD2000"),
+                Map.of(DefaultConversion.NAME_KEY, "Tokyo to JGD2000"),
                 new AbstractSingleOperation[] {before, op, after}, mtFactory);
     }
 
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/DefaultConversionTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/DefaultConversionTest.java
index 4c4cd40bf3..ec445d5b46 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/DefaultConversionTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/DefaultConversionTest.java
@@ -18,7 +18,6 @@ package org.apache.sis.referencing.operation;
 
 import java.util.Map;
 import java.util.HashMap;
-import java.util.Collections;
 import org.opengis.util.FactoryException;
 import org.opengis.parameter.ParameterValue;
 import org.opengis.parameter.ParameterValueGroup;
@@ -85,19 +84,19 @@ public final strictfp class DefaultConversionTest extends TestCase {
     private static GeographicCRS createParisCRS(final boolean isSource, final EllipsoidalCS cs, final boolean useGreenwich) {
         DefaultGeodeticDatum datum = HardCodedDatum.NTF;
         if (useGreenwich) {
-            datum = new DefaultGeodeticDatum(Collections.singletonMap(DefaultGeodeticDatum.NAME_KEY, datum.getName()),
-                    datum.getEllipsoid(), HardCodedDatum.GREENWICH);
+            datum = new DefaultGeodeticDatum(Map.of(DefaultGeodeticDatum.NAME_KEY, datum.getName()),
+                                             datum.getEllipsoid(), HardCodedDatum.GREENWICH);
         }
-        return new DefaultGeographicCRS(Collections.singletonMap(GeographicCRS.NAME_KEY,
-                isSource ? HardCodedCRS.NTF.getName() : "Back to Greenwich"), datum, cs);
+        return new DefaultGeographicCRS(Map.of(GeographicCRS.NAME_KEY, isSource ? HardCodedCRS.NTF.getName() : "Back to Greenwich"),
+                                        datum, cs);
     }
 
     /**
      * Changes only the coordinate system of the given CRS, which is supposed geographic.
      */
     private static GeographicCRS changeCS(final CoordinateReferenceSystem crs, final EllipsoidalCS cs) {
-        return new DefaultGeographicCRS(Collections.singletonMap(DefaultGeographicCRS.NAME_KEY,
-                crs.getName()), ((GeodeticCRS) crs).getDatum(), cs);
+        return new DefaultGeographicCRS(Map.of(DefaultGeographicCRS.NAME_KEY, crs.getName()),
+                                        ((GeodeticCRS) crs).getDatum(), cs);
     }
 
     /**
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/HardCodedConversions.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/HardCodedConversions.java
index db00e7f5f4..974dfbdf6a 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/HardCodedConversions.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/HardCodedConversions.java
@@ -17,7 +17,6 @@
 package org.apache.sis.referencing.operation;
 
 import java.util.Map;
-import java.util.Collections;
 import org.opengis.parameter.ParameterValueGroup;
 import org.opengis.referencing.crs.GeographicCRS;
 import org.opengis.referencing.crs.ProjectedCRS;
@@ -101,7 +100,7 @@ public final strictfp class HardCodedConversions {
      * Creates a defining conversion of the given name with given parameter values.
      */
     private static DefaultConversion create(final String name, final OperationMethod method, final ParameterValueGroup pg) {
-        return new DefaultConversion(Collections.singletonMap(OperationMethod.NAME_KEY, name), method, null, pg);
+        return new DefaultConversion(Map.of(OperationMethod.NAME_KEY, name), method, null, pg);
     }
 
     /**
@@ -120,7 +119,7 @@ public final strictfp class HardCodedConversions {
      * @return two-dimensional projection using the given method.
      */
     public static DefaultProjectedCRS createCRS(final DefaultConversion conversion) {
-        return new DefaultProjectedCRS(Collections.singletonMap(ProjectedCRS.NAME_KEY, conversion.getName()),
+        return new DefaultProjectedCRS(Map.of(ProjectedCRS.NAME_KEY, conversion.getName()),
                 HardCodedCRS.WGS84, conversion, HardCodedCS.PROJECTED);
     }
 
@@ -190,6 +189,6 @@ public final strictfp class HardCodedConversions {
      * Puts the given name in a property map CRS constructors.
      */
     private static Map<String,?> name(final String name) {
-        return Collections.singletonMap(ProjectedCRS.NAME_KEY, name);
+        return Map.of(ProjectedCRS.NAME_KEY, name);
     }
 }
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/builder/LinearTransformBuilderTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/builder/LinearTransformBuilderTest.java
index e6cbe41257..8975717510 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/builder/LinearTransformBuilderTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/builder/LinearTransformBuilderTest.java
@@ -19,7 +19,6 @@ package org.apache.sis.referencing.operation.builder;
 import java.util.Map;
 import java.util.HashMap;
 import java.util.Random;
-import java.util.Collections;
 import java.awt.geom.AffineTransform;
 import org.opengis.util.FactoryException;
 import org.opengis.geometry.DirectPosition;
@@ -469,9 +468,9 @@ public final strictfp class LinearTransformBuilderTest extends TestCase {
             }
         }
         final NonLinearTransform tr = new NonLinearTransform();
-        builder.addLinearizers(Collections.singletonMap("x² y³", tr));
-        builder.addLinearizers(Collections.singletonMap("x³ y²", tr), 1, 0);
-        builder.addLinearizers(Collections.singletonMap("identity", MathTransforms.identity(2)));
+        builder.addLinearizers(Map.of("x² y³", tr));
+        builder.addLinearizers(Map.of("x³ y²", tr), 1, 0);
+        builder.addLinearizers(Map.of("identity", MathTransforms.identity(2)));
         final Matrix m = builder.create(null).getMatrix();
         assertEquals("linearizer", "x³ y²", builder.linearizer().get().getKey());
         assertNotSame("linearizer", tr, builder.linearizer().get());    // Not same because axes should have been swapped.
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/NoOp.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/NoOp.java
index 89cb0ee67d..371ace9574 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/NoOp.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/NoOp.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.referencing.operation.projection;
 
-import java.util.Collections;
+import java.util.Map;
 import org.opengis.parameter.ParameterValueGroup;
 import org.opengis.referencing.datum.Ellipsoid;
 import org.opengis.referencing.operation.Matrix;
@@ -72,9 +72,9 @@ final strictfp class NoOp extends ConformalProjection {
     @Workaround(library="JDK", version="1.7")
     private NoOp(final Parameters parameters) {
         super(new Initializer(new DefaultOperationMethod(
-                Collections.singletonMap(DefaultOperationMethod.NAME_KEY, parameters.getDescriptor().getName()),
+                Map.of(DefaultOperationMethod.NAME_KEY, parameters.getDescriptor().getName()),
                 DIMENSION, DIMENSION,
-                parameters.getDescriptor()), parameters, Collections.emptyMap(), null));
+                parameters.getDescriptor()), parameters, Map.of(), null));
     }
 
     /**
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/SatelliteTrackingTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/SatelliteTrackingTest.java
index 75aa143c9e..9e72311753 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/SatelliteTrackingTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/SatelliteTrackingTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.referencing.operation.projection;
 
-import java.util.Collections;
+import java.util.Map;
 import org.opengis.util.FactoryException;
 import org.opengis.parameter.ParameterValueGroup;
 import org.opengis.referencing.operation.TransformException;
@@ -68,7 +68,7 @@ public final strictfp class SatelliteTrackingTest extends MapProjectionTestCase
         final SatelliteTracking provider = new SatelliteTracking();
         final ParameterValueGroup values = provider.getParameters().createValue();
         final DefaultEllipsoid    sphere = DefaultEllipsoid.createEllipsoid(
-                Collections.singletonMap(DefaultEllipsoid.NAME_KEY, NilReferencingObject.UNNAMED), 1, 1, Units.METRE);
+                Map.of(DefaultEllipsoid.NAME_KEY, NilReferencingObject.UNNAMED), 1, 1, Units.METRE);
 
         values.parameter("semi_major")                 .setValue(sphere.getSemiMajorAxis());
         values.parameter("semi_minor")                 .setValue(sphere.getSemiMinorAxis());
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/DefaultMathTransformFactoryTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/DefaultMathTransformFactoryTest.java
index 5dfdcee89d..de9666861e 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/DefaultMathTransformFactoryTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/DefaultMathTransformFactoryTest.java
@@ -19,7 +19,6 @@ package org.apache.sis.referencing.operation.transform;
 import java.util.Map;
 import java.util.Set;
 import java.util.Collection;
-import java.util.Collections;
 import org.opengis.util.FactoryException;
 import org.opengis.util.NoSuchIdentifierException;
 import org.opengis.referencing.operation.Conversion;
@@ -194,7 +193,7 @@ public final strictfp class DefaultMathTransformFactoryTest extends TestCase {
          * and default parameter values.
          */
         final MathTransformFactory factory = factory();
-        final Map<String,?> dummyName = Collections.singletonMap(DefaultProjectedCRS.NAME_KEY, "Test");
+        final Map<String,?> dummyName = Map.of(DefaultProjectedCRS.NAME_KEY, "Test");
         final Collection<OperationMethod> methods = factory.getAvailableMethods(Projection.class);
         for (final OperationMethod method : methods) {
             final String classification = method.getName().getCode();
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/SinusoidalShiftGrid.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/SinusoidalShiftGrid.java
index 1a8e93e7e1..10ccd66dcf 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/SinusoidalShiftGrid.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/SinusoidalShiftGrid.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.referencing.operation.transform;
 
-import java.util.Collections;
+import java.util.Map;
 import java.awt.geom.AffineTransform;
 import javax.measure.quantity.Dimensionless;
 import org.opengis.parameter.ParameterDescriptorGroup;
@@ -163,7 +163,7 @@ final strictfp class SinusoidalShiftGrid extends DatumShiftGrid<Dimensionless,Di
     @Override
     public ParameterDescriptorGroup getParameterDescriptors() {
         return new DefaultParameterDescriptorGroup(
-                Collections.singletonMap(DefaultParameterDescriptorGroup.NAME_KEY, "Test grid"), 0, 1);
+                Map.of(DefaultParameterDescriptorGroup.NAME_KEY, "Test grid"), 0, 1);
     }
 
     /**
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/WraparoundTransformTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/WraparoundTransformTest.java
index fa44114a13..ce41dc31d9 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/WraparoundTransformTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/WraparoundTransformTest.java
@@ -16,8 +16,8 @@
  */
 package org.apache.sis.referencing.operation.transform;
 
+import java.util.Map;
 import java.util.List;
-import java.util.Collections;
 import org.opengis.referencing.operation.MathTransform;
 import org.opengis.referencing.operation.MathTransformFactory;
 import org.opengis.referencing.operation.TransformException;
@@ -85,8 +85,8 @@ public final strictfp class WraparoundTransformTest extends TestCase {
      */
     @Test
     public void testOneAxis() throws TransformException {
-        final AbstractCoordinateOperation op = new AbstractCoordinateOperation(
-                Collections.singletonMap(AbstractCoordinateOperation.NAME_KEY, "Wrapper"),
+        final var op = new AbstractCoordinateOperation(
+                Map.of(AbstractCoordinateOperation.NAME_KEY, "Wrapper"),
                 HardCodedCRS.WGS84_LATITUDE_FIRST,
                 HardCodedCRS.WGS84_LATITUDE_FIRST.forConvention(AxesConvention.POSITIVE_RANGE),
                 null, MathTransforms.scale(3, 5));
@@ -143,8 +143,8 @@ public final strictfp class WraparoundTransformTest extends TestCase {
      */
     @Test
     public void testTwoAxes() throws TransformException {
-        final AbstractCoordinateOperation op = new AbstractCoordinateOperation(
-                Collections.singletonMap(AbstractCoordinateOperation.NAME_KEY, "Wrapper"),
+        final var op = new AbstractCoordinateOperation(
+                Map.of(AbstractCoordinateOperation.NAME_KEY, "Wrapper"),
                 HardCodedCRS.WGS84_WITH_TIME.forConvention(AxesConvention.POSITIVE_RANGE),
                 HardCodedCRS.WGS84_WITH_CYCLIC_TIME, null, MathTransforms.scale(3, 2, 5));
         /*
diff --git a/core/sis-utility/src/main/java/org/apache/sis/internal/util/DefinitionURI.java b/core/sis-utility/src/main/java/org/apache/sis/internal/util/DefinitionURI.java
index c8e40dc6ff..3d10f29c15 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/internal/util/DefinitionURI.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/internal/util/DefinitionURI.java
@@ -18,7 +18,6 @@ package org.apache.sis.internal.util;
 
 import java.util.Map;
 import java.util.TreeMap;
-import java.util.Collections;
 import org.apache.sis.util.CharSequences;
 import org.apache.sis.util.logging.Logging;
 import org.apache.sis.internal.system.Loggers;
@@ -175,7 +174,7 @@ public final class DefinitionURI {
      * If new entries are added, then see the TODO comment in the {@link #codeForGML(String, String, String, int,
      * DefinitionURI)} method.</p>
      */
-    private static final Map<String,String> PATHS = Collections.singletonMap("crs", "//" + DOMAIN + "/gml/srs/");
+    private static final Map<String,String> PATHS = Map.of("crs", "//" + DOMAIN + "/gml/srs/");
 
     /**
      * A version number to be considered as if no version were provided.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/measure/UnitDimension.java b/core/sis-utility/src/main/java/org/apache/sis/measure/UnitDimension.java
index d8a425e80d..916501ccbe 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/measure/UnitDimension.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/measure/UnitDimension.java
@@ -95,7 +95,7 @@ final class UnitDimension implements Dimension, Serializable {
     @SuppressWarnings("ThisEscapedInObjectConstruction")    // Safe because this class is final.
     UnitDimension(final char symbol) {
         this.symbol = symbol;
-        components  = Collections.singletonMap(this, new Fraction(1,1).unique());
+        components  = Map.of(this, new Fraction(1,1).unique());
         UnitRegistry.init(components, this);
     }
 
@@ -244,7 +244,7 @@ final class UnitDimension implements Dimension, Serializable {
         @SuppressWarnings("unchecked")
         Map<Dimension,Integer> components = (Map<Dimension,Integer>) dimension.getBaseDimensions();
         if (components == null) {
-            return Collections.singletonMap(dimension, new Fraction(1,1));
+            return Map.of(dimension, new Fraction(1,1));
         }
         return ObjectConverters.derivedValues(components, Dimension.class, FractionConverter.FromInteger.INSTANCE);
     }
diff --git a/core/sis-utility/src/main/java/org/apache/sis/measure/UnitFormat.java b/core/sis-utility/src/main/java/org/apache/sis/measure/UnitFormat.java
index fde6d56cca..29715f77c8 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/measure/UnitFormat.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/measure/UnitFormat.java
@@ -716,7 +716,7 @@ appPow: if (unit == null) {
         } else {
             // Fallback for foreigner implementations (power restricted to integer).
             Map<? extends Unit<?>, Integer> c = unscaled.getBaseUnits();
-            if (c == null) c = Collections.singletonMap(unit, 1);
+            if (c == null) c = Map.of(unit, 1);
             components = c;
             for (final Map.Entry<? extends Unit<?>, Integer> e : c.entrySet()) {
                 final int power = e.getValue();
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/DefaultInternationalString.java b/core/sis-utility/src/main/java/org/apache/sis/util/DefaultInternationalString.java
index a5bafdcdfc..74beee9409 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/DefaultInternationalString.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/DefaultInternationalString.java
@@ -59,7 +59,9 @@ public class DefaultInternationalString extends AbstractInternationalString impl
 
     /**
      * The string values in different locales (never {@code null}).
+     * May contains the {@code null} key.
      */
+    @SuppressWarnings("serial")
     private Map<Locale,String> localeMap;
 
     /**
@@ -111,7 +113,7 @@ public class DefaultInternationalString extends AbstractInternationalString impl
                 localeMap = Collections.singletonMap(entry.getKey(), entry.getValue());
             } else {
                 localeMap = new LinkedHashMap<>(strings);
-                // If HashMap is replaced by another type, please revisit 'getLocales()'.
+                // If HashMap is replaced by another type, revisit `getLocales()`.
             }
         }
         final boolean nullMapKey = localeMap.containsKey(null);
@@ -139,7 +141,7 @@ public class DefaultInternationalString extends AbstractInternationalString impl
                 return;
             }
             case 1: {
-                // If HashMap is replaced by another type, please revisit 'getLocales()'.
+                // If HashMap is replaced by another type, revisit `getLocales()`.
                 localeMap = new LinkedHashMap<>(localeMap);
                 localeSet = null;
                 break;
@@ -260,8 +262,8 @@ public class DefaultInternationalString extends AbstractInternationalString impl
              *  3) Locale.getDefault()
              *
              * Locale.getDefault() must be last because the i18n string is often constructed with
-             * an English sentence for the 'ROOT' locale (the unlocalized text), without explicit
-             * entry for the English locale since the 'ROOT' locale is the fallback. If we were
+             * an English sentence for the `ROOT` locale (the unlocalized text), without explicit
+             * entry for the English locale since the `ROOT` locale is the fallback. If we were
              * looking for the default locale first on a system having French as the default locale,
              * we would get a sentence in French when the user asked for a sentence in English or
              * any language not explicitly declared.
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/collection/DefaultTreeTable.java b/core/sis-utility/src/main/java/org/apache/sis/util/collection/DefaultTreeTable.java
index 4075275b12..835a940a36 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/collection/DefaultTreeTable.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/collection/DefaultTreeTable.java
@@ -21,7 +21,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.LinkedHashMap;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Objects;
 import java.io.Serializable;
 import org.apache.sis.util.ArgumentChecks;
@@ -84,6 +83,7 @@ public class DefaultTreeTable implements TreeTable, Cloneable, Serializable {
      * @see #getRoot()
      * @see #setRoot(TreeTable.Node)
      */
+    @SuppressWarnings("serial")         // Not statically typed as Serializable.
     private TreeTable.Node root;
 
     /**
@@ -106,6 +106,7 @@ public class DefaultTreeTable implements TreeTable, Cloneable, Serializable {
      *
      * @see DefaultTreeTable.Node#columnIndices
      */
+    @SuppressWarnings("serial")
     final Map<TableColumn<?>,Integer> columnIndices;
 
     /**
@@ -154,7 +155,7 @@ public class DefaultTreeTable implements TreeTable, Cloneable, Serializable {
     static Map<TableColumn<?>,Integer> createColumnIndices(final TableColumn<?>[] columns) {
         Map<TableColumn<?>,Integer> map;
         switch (columns.length) {
-            case 0:  map = Collections.emptyMap(); break;
+            case 0:  map = Map.of(); break;
             case 1:  map = null; break; // Will be created inside the loop (common case).
             default: map = new LinkedHashMap<>(hashMapCapacity(columns.length)); break;
         }
@@ -163,7 +164,7 @@ public class DefaultTreeTable implements TreeTable, Cloneable, Serializable {
             ArgumentChecks.ensureNonNullElement("columns", i, column);
             final Integer pos = i;
             if (map == null) {
-                map = Collections.singletonMap(column, pos);
+                map = Map.of(column, pos);
             } else if (map.put(column, pos) != null) {
                 throw new IllegalArgumentException(Errors.format(Errors.Keys.DuplicatedIdentifier_1, column));
             }
@@ -392,12 +393,14 @@ public class DefaultTreeTable implements TreeTable, Cloneable, Serializable {
          * @see #getParent()
          * @see #setParent(TreeTable.Node)
          */
+        @SuppressWarnings("serial")         // Not statically typed as Serializable.
         private TreeTable.Node parent;
 
         /**
          * The list of children, or {@code null} if none.
          * Created only when first needed.
          */
+        @SuppressWarnings("serial")
         private List<TreeTable.Node> children;
 
         /**
@@ -409,11 +412,13 @@ public class DefaultTreeTable implements TreeTable, Cloneable, Serializable {
          *
          * @see DefaultTreeTable#columnIndices
          */
+        @SuppressWarnings("serial")
         final Map<TableColumn<?>,Integer> columnIndices;
 
         /**
          * The values, or {@code null} if not yet created.
          */
+        @SuppressWarnings("serial")
         private Object[] values;
 
         /**
@@ -535,8 +540,7 @@ public class DefaultTreeTable implements TreeTable, Cloneable, Serializable {
          * automatically updates the {@linkplain #getParent() parent} reference of any {@code Node}
          * instance added to or removed from the list.
          *
-         * <p>For leaf nodes, this method returns an unmodifiable
-         * {@linkplain Collections#emptyList() empty list}.</p>
+         * <p>For leaf nodes, this method returns an unmodifiable {@linkplain List#of() empty list}.</p>
          */
         /* NOTE: If a future version removes the "final" keyword, then search for calls to
          * this method where the return value is casted to TreeNodeList. Any unconditional
@@ -547,7 +551,7 @@ public class DefaultTreeTable implements TreeTable, Cloneable, Serializable {
         public final List<TreeTable.Node> getChildren() {
             if (children == null) {
                 if (isLeaf()) {
-                    children = Collections.emptyList();
+                    children = List.of();
                 } else {
                     children = new Children(this);
                 }
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/collection/TableColumn.java b/core/sis-utility/src/main/java/org/apache/sis/util/collection/TableColumn.java
index 33e921d571..e72d46b5f4 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/collection/TableColumn.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/collection/TableColumn.java
@@ -17,7 +17,6 @@
 package org.apache.sis.util.collection;
 
 import java.util.Map;
-import java.util.Collections;
 import java.io.Serializable;
 import java.io.ObjectStreamException;
 import java.io.InvalidObjectException;
@@ -175,7 +174,7 @@ public class TableColumn<V> implements CheckedContainer<V> {
      * A map containing only the {@link #NAME} column.
      * This is the default set of columns when parsing a tree table.
      */
-    static final Map<TableColumn<?>,Integer> NAME_MAP = Collections.singletonMap(NAME, 0);
+    static final Map<TableColumn<?>,Integer> NAME_MAP = Map.of(NAME, 0);
 
     /**
      * Base type of all values in the column identified by this {@code ColumnTable} instance.
diff --git a/core/sis-utility/src/test/java/org/apache/sis/measure/SystemUnitTest.java b/core/sis-utility/src/test/java/org/apache/sis/measure/SystemUnitTest.java
index 8e74d75678..ced8c18b29 100644
--- a/core/sis-utility/src/test/java/org/apache/sis/measure/SystemUnitTest.java
+++ b/core/sis-utility/src/test/java/org/apache/sis/measure/SystemUnitTest.java
@@ -19,7 +19,6 @@ package org.apache.sis.measure;
 import java.util.List;
 import java.util.Map;
 import java.util.HashMap;
-import java.util.Collections;
 import java.lang.reflect.Field;
 import javax.measure.Unit;
 import javax.measure.UnitConverter;
@@ -135,7 +134,7 @@ public final strictfp class SystemUnitTest extends TestCase {
         assertNull("SECOND", Units.SECOND.getBaseUnits());
         assertTrue("UNITY",  Units.UNITY .getBaseUnits().isEmpty());
 
-        assertMapEquals(Collections.singletonMap(Units.METRE, 3), Units.CUBIC_METRE.getBaseUnits());
+        assertMapEquals(Map.of(Units.METRE, 3), Units.CUBIC_METRE.getBaseUnits());
 
         final Map<Unit<?>,Integer> expected = new HashMap<>(4);
         assertNull(expected.put(Units.KILOGRAM, 1));
diff --git a/core/sis-utility/src/test/java/org/apache/sis/measure/UnitDimensionTest.java b/core/sis-utility/src/test/java/org/apache/sis/measure/UnitDimensionTest.java
index 5700314967..b1f9588efc 100644
--- a/core/sis-utility/src/test/java/org/apache/sis/measure/UnitDimensionTest.java
+++ b/core/sis-utility/src/test/java/org/apache/sis/measure/UnitDimensionTest.java
@@ -16,7 +16,6 @@
  */
 package org.apache.sis.measure;
 
-import java.util.Collections;
 import java.util.Map;
 import java.util.HashMap;
 import javax.measure.Unit;
@@ -144,7 +143,7 @@ public final strictfp class UnitDimensionTest extends TestCase {
         assertNull("LENGTH",        LENGTH       .getBaseDimensions());     // Null value as per JSR-363 specification.
         assertNull("TIME",          TIME         .getBaseDimensions());
         assertTrue("DIMENSIONLESS", DIMENSIONLESS.getBaseDimensions().isEmpty());
-        assertMapEquals(Collections.singletonMap(LENGTH, 3), VOLUME.getBaseDimensions());
+        assertMapEquals(Map.of(LENGTH, 3), VOLUME.getBaseDimensions());
 
         final Map<Dimension,Integer> expected = new HashMap<>(4);
         assertNull(expected.put(MASS,    1));
diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/CRSBuilder.java b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/CRSBuilder.java
index 51ff4268ce..0eee25debb 100644
--- a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/CRSBuilder.java
+++ b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/CRSBuilder.java
@@ -22,7 +22,6 @@ import java.util.Map;
 import java.util.HashSet;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.Collections;
 import java.util.StringJoiner;
 import java.util.logging.Level;
 import java.util.logging.LogRecord;
@@ -223,7 +222,7 @@ final class CRSBuilder extends ReferencingFactoryContainer {
         } else if (lastName != null && lastName.getCode().equals(name)) {
             name = lastName;
         }
-        return Collections.singletonMap(IdentifiedObject.NAME_KEY, name);
+        return Map.of(IdentifiedObject.NAME_KEY, name);
     }
 
     /**
@@ -513,7 +512,7 @@ final class CRSBuilder extends ReferencingFactoryContainer {
                 if (crs == null) {
                     missingValue(GeoKeys.GeographicType);
                 } else {
-                    crs = getCRSFactory().createCompoundCRS(Collections.singletonMap(IdentifiedObject.NAME_KEY, crs.getName()), crs, vertical);
+                    crs = getCRSFactory().createCompoundCRS(Map.of(IdentifiedObject.NAME_KEY, crs.getName()), crs, vertical);
                 }
             }
         }
diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/XMLMetadata.java b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/XMLMetadata.java
index 4c9b3ac6c6..fcacdf7f50 100644
--- a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/XMLMetadata.java
+++ b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/XMLMetadata.java
@@ -18,7 +18,7 @@ package org.apache.sis.storage.geotiff;
 
 import java.util.Locale;
 import java.util.Iterator;
-import java.util.Collections;
+import java.util.Map;
 import java.util.StringJoiner;
 import java.util.logging.Filter;
 import java.util.logging.LogRecord;
@@ -387,7 +387,7 @@ final class XMLMetadata implements Filter {
                  * The `mergeMetadata` method applies heuristic rules for adding components.
                  */
                 metadata.mergeMetadata(XML.unmarshal(new StAXSource(reader),
-                        Collections.singletonMap(XML.WARNING_FILTER, this)),
+                        Map.of(XML.WARNING_FILTER, this)),
                         (listeners != null) ? listeners.getLocale() : null);
             }
             reader.close();     // No need to close the underlying input stream.
diff --git a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/CRSBuilder.java b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/CRSBuilder.java
index 5d7df21b4d..03828f4ce4 100644
--- a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/CRSBuilder.java
+++ b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/CRSBuilder.java
@@ -20,7 +20,6 @@ import java.util.Map;
 import java.util.List;
 import java.util.Arrays;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.StringJoiner;
 import java.util.function.Supplier;
 import java.util.logging.Level;
@@ -507,7 +506,7 @@ previous:   for (int i=components.size(); --i >= 0;) {
      * @param  name  name of the geodetic object (datum, coordinate system, …) to create.
      */
     private static Map<String,?> properties(final Object name) {
-        return Collections.singletonMap(IdentifiedObject.NAME_KEY, name);
+        return Map.of(IdentifiedObject.NAME_KEY, name);
     }
 
     /**
diff --git a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/GridMapping.java b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/GridMapping.java
index 3347d943be..6a64418bc5 100644
--- a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/GridMapping.java
+++ b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/GridMapping.java
@@ -20,7 +20,6 @@ import java.util.Map;
 import java.util.List;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.Collections;
 import java.util.Locale;
 import java.util.logging.Level;
 import java.util.logging.LogRecord;
@@ -415,7 +414,7 @@ final class GridMapping {
                 name = fallback.toString();
             }
         }
-        return Collections.singletonMap(IdentifiedObject.NAME_KEY, name);
+        return Map.of(IdentifiedObject.NAME_KEY, name);
     }
 
     /**
diff --git a/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/Analyzer.java b/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/Analyzer.java
index 9e84bed1c1..4b7de5d982 100644
--- a/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/Analyzer.java
+++ b/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/Analyzer.java
@@ -21,7 +21,6 @@ import java.util.Map;
 import java.util.HashMap;
 import java.util.LinkedHashSet;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Objects;
 import java.util.logging.Level;
 import java.sql.SQLException;
@@ -173,7 +172,7 @@ final class Analyzer {
                 } else {
                     name = nameFactory.createGenericName(null, catalog, schema);
                 }
-                namespace = nameFactory.createNameSpace(name, Collections.singletonMap("separator", "."));
+                namespace = nameFactory.createNameSpace(name, Map.of("separator", "."));
             } else {
                 namespace = null;
             }
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java
index 2754466ad2..4c5370968e 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java
@@ -578,9 +578,10 @@ final class Store extends URIDataStore implements FeatureSet {
             }
             properties.add(createProperty(name, type, minOccurrence, maxOccurrence, characteristics));
         }
+        // Do not use Map.of(…) because `name` may be null. Let constructor throw the exception.
         final String name = IOUtilities.filenameWithoutExtension(super.getDisplayName());
         return new DefaultFeatureType(Collections.singletonMap(DefaultFeatureType.NAME_KEY, name),
-                false, null, properties.toArray(PropertyType[]::new));
+                                      false, null, properties.toArray(PropertyType[]::new));
     }
 
     /**
@@ -591,7 +592,7 @@ final class Store extends URIDataStore implements FeatureSet {
             final int minOccurrence, final int maxOccurrence, final AttributeType<?>[] characteristics)
     {
         return new DefaultAttributeType<>(Collections.singletonMap(DefaultAttributeType.NAME_KEY, name),
-                type, minOccurrence, maxOccurrence, null, characteristics);
+                                          type, minOccurrence, maxOccurrence, null, characteristics);
     }
 
     /**
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/folder/Store.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/folder/Store.java
index 5e3be6dc13..a78fe0e860 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/folder/Store.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/folder/Store.java
@@ -20,7 +20,6 @@ import java.util.Map;
 import java.util.List;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Locale;
 import java.util.TimeZone;
 import java.util.Optional;
@@ -257,7 +256,7 @@ class Store extends DataStore implements StoreResource, UnstructuredAggregate, D
                 nameFactory = DefaultFactories.forBuildin(NameFactory.class);
             }
             GenericName name = nameFactory.createLocalName(null, super.getDisplayName());
-            NameSpace   ns   = nameFactory.createNameSpace(name, Collections.singletonMap("separator", "/"));
+            NameSpace   ns   = nameFactory.createNameSpace(name, Map.of("separator", "/"));
             identifier       = nameFactory.createLocalName(ns, ".");
         }
         return identifier;
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/Store.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/Store.java
index d37630bb1e..5a48332686 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/Store.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/Store.java
@@ -17,7 +17,6 @@
 package org.apache.sis.internal.storage.xml;
 
 import java.util.Map;
-import java.util.Collections;
 import java.util.logging.Filter;
 import java.util.logging.LogRecord;
 import java.io.Closeable;
@@ -124,7 +123,7 @@ final class Store extends URIDataStore implements Filter {
      */
     private Map<String,?> properties() {
         if (listeners.hasListeners(WarningEvent.class)) {
-            return Collections.singletonMap(XML.WARNING_FILTER, this);
+            return Map.of(XML.WARNING_FILTER, this);
         }
         return null;
     }
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/JoinFeatureSet.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/JoinFeatureSet.java
index f4a856dcd5..d8297aff83 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/JoinFeatureSet.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/JoinFeatureSet.java
@@ -19,7 +19,6 @@ package org.apache.sis.storage.aggregate;
 import java.util.Map;
 import java.util.List;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.Spliterator;
 import java.util.function.Consumer;
 import java.util.stream.Stream;
@@ -234,22 +233,22 @@ public class JoinFeatureSet extends AggregatedFeatureSet {
          * Since we are going to need the type for any use of this JoinFeatureSet, better to create it now.
          */
         PropertyType[] properties = new PropertyType[] {
-            new DefaultAssociationRole(name(leftAlias),  leftType,  joinType.minimumOccurs(false), 1),
-            new DefaultAssociationRole(name(rightAlias), rightType, joinType.minimumOccurs(true),  1)
+            new DefaultAssociationRole(properties(leftAlias),  leftType,  joinType.minimumOccurs(false), 1),
+            new DefaultAssociationRole(properties(rightAlias), rightType, joinType.minimumOccurs(true),  1)
         };
         final String identifierDelimiter = Containers.property(featureInfo, "identifierDelimiter", String.class);
         if (identifierDelimiter != null && AttributeConvention.hasIdentifier(leftType)
                                         && AttributeConvention.hasIdentifier(rightType))
         {
             final Operation identifier = FeatureOperations.compound(
-                    name(AttributeConvention.IDENTIFIER_PROPERTY), identifierDelimiter,
+                    properties(AttributeConvention.IDENTIFIER_PROPERTY), identifierDelimiter,
                     Containers.property(featureInfo, "identifierPrefix", String.class),
                     Containers.property(featureInfo, "identifierSuffix", String.class), properties);
             properties = ArraysExt.insert(properties, 0, 1);
             properties[0] = identifier;
         }
         if (featureInfo == null) {
-            featureInfo = name(leftName.tip().toString() + '-' + rightName.tip());
+            featureInfo = properties(leftName.tip().toString() + '-' + rightName.tip());
         }
         type = new DefaultFeatureType(featureInfo, false, null, properties);
     }
@@ -258,8 +257,8 @@ public class JoinFeatureSet extends AggregatedFeatureSet {
      * Creates a minimal {@code properties} map for feature type or property type constructors.
      * This minimalist map contain only the mandatory entry, which is the name.
      */
-    private static Map<String,?> name(final Object name) {
-        return Collections.singletonMap(DefaultFeatureType.NAME_KEY, name);
+    private static Map<String,?> properties(final Object name) {
+        return Map.of(DefaultFeatureType.NAME_KEY, name);
     }
 
     /**
diff --git a/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/xml/MimeTypeDetectorTest.java b/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/xml/MimeTypeDetectorTest.java
index 290e9e1360..d9f23fcdb6 100644
--- a/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/xml/MimeTypeDetectorTest.java
+++ b/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/xml/MimeTypeDetectorTest.java
@@ -17,7 +17,6 @@
 package org.apache.sis.internal.storage.xml;
 
 import java.util.Map;
-import java.util.Collections;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.StringReader;
@@ -67,7 +66,7 @@ public final strictfp class MimeTypeDetectorTest extends TestUsingFile {
      * Implementation of test methods using a hard-coded XML string as a source.
      */
     private static void testFromString(final String xml) throws IOException {
-        assertEquals("application/vnd.iso.19139+xml", getMimeType(xml, Collections.emptyMap()));
+        assertEquals("application/vnd.iso.19139+xml", getMimeType(xml, Map.of()));
     }
 
     /**
@@ -78,7 +77,7 @@ public final strictfp class MimeTypeDetectorTest extends TestUsingFile {
         assertEquals('<', in.read());
         assertEquals('?', in.read());
         final MimeTypeDetector detector = new MimeTypeDetector(
-                Collections.singletonMap(LegacyNamespaces.GMD, "application/vnd.iso.19139+xml"),
+                Map.of(LegacyNamespaces.GMD, "application/vnd.iso.19139+xml"),
                 mimeForRootElements)
         {
             @Override int read() throws IOException {
@@ -102,8 +101,8 @@ public final strictfp class MimeTypeDetectorTest extends TestUsingFile {
             assertEquals('<', in.read());
             assertEquals('?', in.read());
             final MimeTypeDetector detector = new MimeTypeDetector(
-                    Collections.singletonMap(LegacyNamespaces.GMD, "application/vnd.iso.19139+xml"),
-                    Collections.emptyMap())
+                    Map.of(LegacyNamespaces.GMD, "application/vnd.iso.19139+xml"),
+                    Map.of())
             {
                 @Override int read() throws IOException {
                     return in.read();
@@ -124,7 +123,7 @@ public final strictfp class MimeTypeDetectorTest extends TestUsingFile {
         final String type = getMimeType(
                 "<?xml version=\"1.0\" standalone=\"yes\"?>\n" +
                 "<MD_Metadata xmlns:xsi=\"" + Namespaces.XSI + "\">\n",
-                Collections.singletonMap("MD_Metadata", "application/vnd.iso.19115+xml"));
+                Map.of("MD_Metadata", "application/vnd.iso.19115+xml"));
         assertEquals("application/vnd.iso.19115+xml", type);
     }
 }
diff --git a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/GroupAsPolylineOperation.java b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/GroupAsPolylineOperation.java
index 83d044aaf4..562f91b22b 100644
--- a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/GroupAsPolylineOperation.java
+++ b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/GroupAsPolylineOperation.java
@@ -19,7 +19,6 @@ package org.apache.sis.internal.storage.gpx;
 import java.util.Map;
 import java.util.Iterator;
 import java.util.Collection;
-import java.util.Collections;
 import org.opengis.parameter.ParameterDescriptorGroup;
 import org.opengis.parameter.ParameterValueGroup;
 import org.apache.sis.feature.AbstractAttribute;
@@ -82,6 +81,7 @@ final class GroupAsPolylineOperation extends AbstractOperation {
     /**
      * The expected result type to be returned by {@link #getResult()}.
      */
+    @SuppressWarnings("serial")
     private final AttributeType<?> result;
 
     /**
@@ -104,8 +104,8 @@ final class GroupAsPolylineOperation extends AbstractOperation {
      * @param  geometries  accessor to the geometry implementation in use (Java2D, ESRI or JTS).
      */
     static <G> AttributeType<? extends G> getResult(final Geometries<G> geometries) {
-        return new DefaultAttributeType<>(Collections.singletonMap(NAME_KEY, AttributeConvention.ENVELOPE_PROPERTY),
-                geometries.polylineClass, 1, 1, null);
+        return new DefaultAttributeType<>(Map.of(NAME_KEY, AttributeConvention.ENVELOPE_PROPERTY),
+                                          geometries.polylineClass, 1, 1, null);
     }
 
     /**
diff --git a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Types.java b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Types.java
index 29461d5df5..c1fb0a9d95 100644
--- a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Types.java
+++ b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Types.java
@@ -17,7 +17,6 @@
 package org.apache.sis.internal.storage.gpx;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Locale;
 import java.util.Map;
 import java.util.HashMap;
@@ -135,8 +134,8 @@ final class Types {
         geometries = Geometries.implementation(library);
         final Map<String,InternationalString[]> resources = new HashMap<>();
         final ScopedName    geomName = AttributeConvention.GEOMETRY_PROPERTY;
-        final Map<String,?> geomInfo = Collections.singletonMap(AbstractIdentifiedType.NAME_KEY, geomName);
-        final Map<String,?> envpInfo = Collections.singletonMap(AbstractIdentifiedType.NAME_KEY, AttributeConvention.ENVELOPE_PROPERTY);
+        final Map<String,?> geomInfo = Map.of(AbstractIdentifiedType.NAME_KEY, geomName);
+        final Map<String,?> envpInfo = Map.of(AbstractIdentifiedType.NAME_KEY, AttributeConvention.ENVELOPE_PROPERTY);
         /*
          * The parent of all FeatureTypes to be created in this constructor.
          * This parent has a single property, "sis:identifier" of type Integer,