Код трудно читать и не очень эффективен. Параметр "dest" сбивает с толку: он передается как параметр, затем очищается и результаты добавляются в него. Какой смысл быть параметром? Почему бы просто не вернуть новую коллекцию? Единственное преимущество, которое я вижу, это то, что вызывающая сторона может определить тип коллекции. Это необходимо?
Я думаю, что этот код может быть написан более четко и, вероятно, более эффективно следующим образом:
public static Set<String> createSet(Collection<String> source) {
Set<String> destination = new HashSet<String>(source) {
private static final long serialVersionUID = 1L;
public boolean add(String o) {
if ("".equals(o)) {
return false;
}
return super.add(o);
}
};
return destination;
}
Другой способ - создать собственный тип набора:
public class NonEmptyStringSet extends HashSet<String> {
private static final long serialVersionUID = 1L;
public NonEmptyStringSet() {
super();
}
public NonEmptyStringSet(Collection<String> source) {
super(source);
}
public boolean add(String o) {
if ("".equals(o)) {
return false;
}
return super.add(o);
}
}
Использование:
createSet(source);
new NonEmptyStringSet(source);
Возврат набора является более производительным, поскольку вам не нужно сначала создавать временный набор, а затем добавлять все в коллекцию dest.
Преимущество типа NonEmptyStringSet заключается в том, что вы можете продолжать добавлять строки и при этом проверять пустую строку.
EDIT1:
Удаление "if (src.containsAll (dest)) return;" код вводит «ошибку» при вызове метода с source == dest; В результате источник будет пустым. Пример:
Collection<String> source = new ArrayList<String>();
source.add("abc");
copyStringCollectionAndRemoveDuplicates(source, source);
System.out.println(source);
EDIT2:
Я сделал небольшой тест, который показывает, что моя реализация примерно на 30% быстрее, чем упрощенная версия вашей начальной реализации. Этот тест является оптимальным случаем для вашей первоначальной реализации, поскольку папка dest пуста, поэтому ее не нужно очищать. Также не думайте, что моя реализация использует HashSet вместо LinkedHashSet, что делает мою реализацию немного быстрее.
Код эталона:
public class SimpleBenchmark {
public static void main(String[] args) {
Collection<String> source = Arrays.asList("abc", "def", "", "def", "",
"jsfldsjdlf", "jlkdsf", "dsfjljka", "sdfa", "abc", "dsljkf", "dsjfl",
"js52fldsjdlf", "jladsf", "dsfjdfgljka", "sdf123a", "adfgbc", "dslj452kf", "dsjfafl",
"js21ldsjdlf", "jlkdsvbxf", "dsfjljk342a", "sdfdsa", "abxc", "dsljkfsf", "dsjflasd4" );
int runCount = 1000000;
long start1 = System.currentTimeMillis();
for (int i = 0; i < runCount; i++) {
copyStringCollectionAndRemoveDuplicates(source, new ArrayList<String>());
}
long time1 = (System.currentTimeMillis() - start1);
System.out.println("Time 1: " + time1);
long start2 = System.currentTimeMillis();
for (int i = 0; i < runCount; i++) {
new NonEmptyStringSet(source);
}
long time2 = (System.currentTimeMillis() - start2);
System.out.println("Time 2: " + time2);
long difference = time1 - time2;
double percentage = (double)time2 / (double) time1;
System.out.println("Difference: " + difference + " percentage: " + percentage);
}
public static class NonEmptyStringSet extends HashSet<String> {
private static final long serialVersionUID = 1L;
public NonEmptyStringSet() {
}
public NonEmptyStringSet(Collection<String> source) {
super(source);
}
@Override
public boolean add(String o) {
if ("".equals(o)) {
return false;
}
return super.add(o);
}
}
public static void copyStringCollectionAndRemoveDuplicates(
Collection<String> src, Collection<String> dest) {
Set<String> uniqueSet = new LinkedHashSet<String>(src.size());
for (String f : src)
if (!"".equals(f))
uniqueSet.add(f);
dest.addAll(uniqueSet);
}
}