code: @Nonnull
    public static <KEYTYPE, VALUETYPE> String getImplodedMapped (@Nonnull final String sSepOuter,
                                                                 @Nonnull final String sSepInner,
                                                                 @Nullable final Map <? extends KEYTYPE, ? extends VALUETYPE> aElements,
                                                                 @Nonnull final Function <? super KEYTYPE, String> aKeyMapper,
                                                                 @Nonnull final Function <? super VALUETYPE, String> aValueMapper)
    {
      ValueEnforcer.notNull (sSepOuter, "SepOuter");
      ValueEnforcer.notNull (sSepInner, "SepInner");
  
      final StringBuilder aSB = new StringBuilder ();
      if (aElements != null)
      {
        boolean bFirst = true;
        for (final Map.Entry <? extends KEYTYPE, ? extends VALUETYPE> aElement : aElements.entrySet ())
        {
          if (bFirst)
            bFirst = false;
          else
            aSB.append (sSepOuter);
          aSB.append (aKeyMapper.apply (aElement.getKey ()))
             .append (sSepInner)
             .append (aValueMapper.apply (aElement.getValue ()));
        }
      }
      return aSB.toString ();
    }
docs: Get a concatenated String from all elements of the passed map, separated by
  the specified separator strings.
  
  @param sSepOuter
  The separator to use for separating the map entries. May not be
  <code>null</code>.
  @param sSepInner
  The separator to use for separating the key from the value. May not be
  <code>null</code>.
  @param aElements
  The map to convert. May be <code>null</code> or empty.
  @param aKeyMapper
  The mapping function to convert from KEYTYPE to String. May not be
  <code>null</code>.
  @param aValueMapper
  The mapping function to convert from VALUETYPE to String. May not be
  <code>null</code>.
  @return The concatenated string.
  @param <KEYTYPE>
  Map key type
  @param <VALUETYPE>
  Map value type
  @since 8.5.6