В Java, как сделать метод способным принимать переменные параметры или набор параметров без дублирования кода реализации? - PullRequest
0 голосов
/ 18 ноября 2010

Я ищу способ использовать ту же часть кода для обработки параметров, передаваемых через 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
    }
}

}

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

Спасибо.

С уважением, William

Ответы [ 4 ]

6 голосов
/ 18 ноября 2010

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

Кроме того, семантика не совпадает, поскольку Set неупорядочен и запрещает дублирование, а массив упорядочен и допускает дублирование.1005 * Вы можете определить вторую функцию как

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

и оплатить распределение.

2 голосов
/ 18 ноября 2010
public void func(String...strs){
    func(new HashSet<String>(Arrays.asList(strs)));
}

public void func(Set strs){
    for (String str : strs)
        //Deal with str
    }
}
0 голосов
/ 31 июля 2012

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

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

0 голосов
/ 18 ноября 2010

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

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