code: public GroupName getGroupName(@NonNull List<String> prefixPath, @NonNull Map<String, MetricValue> extraTags) {
          final Stream<String> suffixPath = data.entrySet().stream()
                  .filter(entry -> entry.getKey().getLeft().isPresent()) // Only retain int keys.
                  .sorted(Comparator.comparing(entry -> entry.getKey().getLeft().get())) // Sort by int key.
                  .map(Map.Entry::getValue)
                  .map(value -> value.mapCombine(b -> b.toString(), i -> i.toString(), Function.identity()));
  
          final SimpleGroupPath path = SimpleGroupPath.valueOf(Stream.concat(prefixPath.stream(), suffixPath).collect(Collectors.toList()));
          final Map<String, MetricValue> tags = data.entrySet().stream()
                  .filter(entry -> entry.getKey().getRight().isPresent()) // Only retain string keys.
                  .collect(Collectors.toMap(entry -> entry.getKey().getRight().get(), entry -> entry.getValue().mapCombine(MetricValue::fromBoolean, MetricValue::fromIntValue, MetricValue::fromStrValue)));
          tags.putAll(extraTags);
          return GroupName.valueOf(path, tags);
      }
docs: Create a GroupName from this NamedResolverMap.
  
  @param prefixPath Additional path elements to put in front of the
  returned path.
  @param extraTags Additional tags to put in the tag set. The extraTags
  argument will override any values present in the NamedResolverMap.
  @return A group name derived from this NamedResolverMap and the supplied
  arguments.