class TemporalSetUtils {

    private final TemporalFormattingUtils temporalFormattingUtils;
    
    public TemporalSetUtils(final Locale locale, final ZoneId defaultZoneId) {
        super();
        Validate.notNull(locale, "Locale cannot be null");
        Validate.notNull(defaultZoneId, "ZoneId cannot be null");
        temporalFormattingUtils = new TemporalFormattingUtils(locale, defaultZoneId);
    }

    public Set<String> setFormat(final Set<? extends Temporal> target) {
        return setFormat(target, temporalFormattingUtils::format);
    }

    public <T extends Temporal> Set<String> setFormat(final Set<T> target, final Locale locale) {
        return setFormat(target, time -> temporalFormattingUtils.format(time, locale));
    }

    public <T extends Temporal> Set<String> setFormat(final Set<T> target, final String pattern) {
        return setFormat(target, time -> temporalFormattingUtils.format(time, pattern, null));
    }

    public <T extends Temporal> Set<String> setFormat(final Set<T> target, final String pattern, final Locale locale) {
        return setFormat(target, time -> temporalFormattingUtils.format(time, pattern, locale, null));
    }

    public Set<Integer> setDay(final Set<? extends Temporal> target) {
        return setFormat(target, temporalFormattingUtils::day);
    }

    public Set<Integer> setMonth(final Set<? extends Temporal> target) {
        return setFormat(target, temporalFormattingUtils::month);
    }

    public Set<String> setMonthName(final Set<? extends Temporal> target) {
        return setFormat(target, temporalFormattingUtils::monthName);
    }

    public Set<String> setMonthNameShort(final Set<? extends Temporal> target) {
        return setFormat(target, temporalFormattingUtils::monthNameShort);
    }

    public Set<Integer> setYear(final Set<? extends Temporal> target) {
        return setFormat(target, temporalFormattingUtils::year);
    }
    
    public Set<Integer> setDayOfWeek(final Set<? extends Temporal> target) {
        return setFormat(target, temporalFormattingUtils::dayOfWeek);
    }

    public Set<String> setDayOfWeekName(final Set<? extends Temporal> target) {
        return setFormat(target, temporalFormattingUtils::dayOfWeekName);
    }
    
    public Set<String> setDayOfWeekNameShort(final Set<? extends Temporal> target) {
        return setFormat(target, temporalFormattingUtils::dayOfWeekNameShort);
    }
    
    public Set<Integer> setHour(final Set<? extends Temporal> target) {
        return setFormat(target, temporalFormattingUtils::hour);
    }
    
    public Set<Integer> setMinute(final Set<? extends Temporal> target) {
        return setFormat(target, temporalFormattingUtils::minute);
    }
    
    public Set<Integer> setSecond(final Set<? extends Temporal> target) {
        return setFormat(target, temporalFormattingUtils::second);
    }
    
    public Set<Integer> setNanosecond(final Set<? extends Temporal> target) {
        return setFormat(target, temporalFormattingUtils::nanosecond);
    }

    public Set<String> setFormatISO(final Set<? extends Temporal> target) {
        return setFormat(target, temporalFormattingUtils::formatISO);
    }

    private <R extends Object, T extends Temporal> Set<R> setFormat(
            final Set<T> target, final Function<T, R> mapFunction) {<FILL_FUNCTION_BODY>}

}

        Validate.notNull(target, "Target cannot be null");
        return target.stream()
            .map(time -> mapFunction.apply(time))
            .collect(toSet());
    
<no_super_class>