В 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), если коллекция большая.