В Java, как сделать метод способным принимать переменные параметры или набор параметров без дублирования кода реализации?

Я ищу способ, чтобы я мог использовать ту же часть кода, чтобы иметь дело с передачей параметров через Set или переменные параметры. например

public void func(String...strs){
    for (String str : strs){
        //Deal with str
    }
}

Согласно спецификации, функция также поддерживает:

public void func(Set<String> strs){
    for (String str : strs)
        //Deal with str
    }
}

}

Оба кода обработки идентичны, как я могу объединиться в одну реализацию? Пожалуйста, советуйте.

Спасибо.

С уважением, Уильям

4 ответа

Решение

Нет эффективного решения проблемы, которую вы ставите. Варадические функции получают массив. Никакая волшебная палочка не взмахнет сама и не преобразится из java.util.Set к массиву.

Кроме того, семантика не совпадает, так как Set неупорядочен и запрещает дублирование, а массив упорядочен и разрешает дублирование.

Вы можете определить вторую функцию как

public void func(Set<String> strs) {
   func(strs.toArray(new String[strs.size()]);
}

и оплатить выделение.

public void func(String...strs){
    func(new HashSet<String>(Arrays.asList(strs)));
}

public void func(Set strs){
    for (String str : strs)
        //Deal with str
    }
}

Лучшее, что вы можете сделать, это реализовать свою версию Set следующим образом:

public void func(Set<String> strs) {
    return func(strs.toArray());
}

Это старая ветка, но я думаю, что лучше так делать, потому что вам не нужно конвертировать полную коллекцию.

public void func(String...strs){
    for (String str : strs){
        func_impl(str);
    }
}

public void func(Set strs){
    for (String str : strs)
        func_impl(str);
    }
}

public void func_impl(String str){
    //Deal with str
}

Плюс: нет конвертации.

Минус: большой вызов (func_impl), если коллекция большая.

Другие вопросы по тегам