code: @Nonnull
    public static <ELEMENTTYPE> String getImplodedMappedNonEmpty (@Nonnull final String sSep,
                                                                  @Nullable final ELEMENTTYPE [] aElements,
                                                                  @Nonnegative final int nOfs,
                                                                  @Nonnegative final int nLen,
                                                                  @Nonnull final Function <? super ELEMENTTYPE, String> aMapper)
    {
      ValueEnforcer.notNull (sSep, "Separator");
      if (aElements != null)
        ValueEnforcer.isArrayOfsLen (aElements, nOfs, nLen);
      ValueEnforcer.notNull (aMapper, "Mapper");
  
      final StringBuilder aSB = new StringBuilder ();
      if (aElements != null)
      {
        int nElementsAdded = 0;
        for (int i = nOfs; i < nOfs + nLen; ++i)
        {
          final String sElement = aMapper.apply (aElements[i]);
          if (hasText (sElement))
          {
            if (nElementsAdded > 0)
              aSB.append (sSep);
            nElementsAdded++;
            aSB.append (sElement);
          }
        }
      }
      return aSB.toString ();
    }
docs: Get a concatenated String from all elements of the passed array, separated by
  the specified separator string. This the very generic version of
  {@link #getConcatenatedOnDemand(String, String, String)} for an arbitrary
  number of elements.
  
  @param sSep
  The separator to use. May not be <code>null</code>.
  @param aElements
  The container to convert. May be <code>null</code> or empty.
  @param nOfs
  The offset to start from.
  @param nLen
  The number of elements to implode.
  @param aMapper
  The mapping function to convert from ELEMENTTYPE to String. May not be
  <code>null</code>.
  @return The concatenated string.
  @param <ELEMENTTYPE>
  Array component type
  @since 8.5.6