سلام
گفتم اینارو در قالب یه کلاس util بنویسم که کارت راحت تر باشه (الگوریتم بهینه تری هم براش نوشتم) :
import java.util.*;
import java.util.function.Predicate;
/**
* @author avb
*/
public final class CollectionsUtil {
public static <E, C extends Collection<E>> C convertTo(Iterable<?> src, C target, Class<E> type) {
addAllIf(src, target, type::isInstance);
return target;
}
public static <E> List<E> convertToList(Iterable<?> src, Class<E> type) {
return convertTo(src, new ArrayList<>(), type);
}
public static <E> Set<E> convertToSet(Iterable<?> src, Class<E> type) {
return convertTo(src, new HashSet<>(), type);
}
@SuppressWarnings("unchecked")
public static <E> List<E> copyToList(Iterable<?> src) {
return new ArrayList<>((Collection<? extends E>) src);
}
@SuppressWarnings("unchecked")
public static <E> Set<E> copyToSet(Iterable<?> src) {
return new HashSet<>((Collection<? extends E>) src);
}
@SuppressWarnings("unchecked")
public static <E, C extends Collection<E>> void addAllIf(Iterable<?> src, C target, Predicate<Object> predicate) {
for (Object o : src) {
if (predicate.test(o)) {
target.add((E) o);
}
}
}
}
براش تست هم نوشتم :
import java.util.ArrayList;
import java.util.List;
/**
* @author avb
*/
public class Test {
static interface Runnable<T> {
void run(T t);
}
static <T> String execute(int iteration, T t, Runnable<T> command) {
System.out.println("Iteration count = " + iteration);
long start = System.nanoTime();
for (int i = 0; i < iteration; i++) {
command.run(t);
}
return "Average execution time : " + (System.nanoTime() - start) / (float) iteration + " ns";
}
static List generateList() {
List list = new ArrayList();
for (int i = 0; i < 20000; i++) {
list.add(i);
}
for (int i = 20000; i < 40000; i++) {
list.add(i + .5f);
}
for (int i = 40000; i < 60000; i++) {
list.add(String.valueOf(i));
}
System.out.println("Generated list size = " + list.size());
return list;
}
public static void main(String[] args) {
final int iteration = 10000;
final List testList = generateList();
System.out.println("Method : copyToList => " + execute(iteration, testList, CollectionsUtil::copyToList));
System.out.println("****************************** **********");
System.out.println("Method : convertTo => " + execute(iteration, testList, list -> CollectionsUtil.convertTo(list, new ArrayList<>(), String.class)));
System.out.println("****************************** **********");
System.out.println("Method : convertToList => " + execute(iteration, testList, list -> CollectionsUtil.convertToList(list, String.class)));
}
}
خروجی تست :
Generated list size = 60000
Iteration count = 10000
Method : copyToList => Average execution time : 52340.668 ns
****************************************
Generated list size = 60000
Iteration count = 10000
Method : convertTo => Average execution time : 252133.38 ns
****************************************
Generated list size = 60000
Iteration count = 10000
Method : convertToList => Average execution time : 220010.7 ns
پ.ن : این تست برای حالت متوسطه و نتایج بهترین و بدترین حالت میتونه متفاوت باشه (مثلا اگر کل لیست از نوع Integer باشه یا کلش String باشه)