有没有更好的方法在Java-8中对集合进行排序,而不先检查集合是空还是空?
if (institutions != null && !institutions.isEmpty()) {
Collections.sort(institutions);
}
答案 0 :(得分:1)
尽管这个问题很古老,但只是添加了另一种解决方法。 首先,集合不应为null。如果是这样:
institutions.sort(Comparator.comparing(Institutions::getId));
答案 1 :(得分:0)
我只能想到三(4)种方式:
然后是普通的Collections.sort()。您不必检查列表是否为空,但是您必须确保它不为空。坦率地说,你有没有一个用例,你的列表是空的,你想要对它进行排序?这听起来像是一个设计问题。
最后,您可以使用流来返回已排序的流。我写了一个测试时间的小测试:
public static void main(String[] args) {
List<Integer> t1 = new ArrayList<>();
List<Integer> t2 = new ArrayList<>();
List<Integer> t3 = new ArrayList<>();
for(int i = 0; i< 100_000_00; i++) {
int tmp = new Random().nextInt();
t1.add(tmp);
t2.add(tmp);
t3.add(tmp);
}
long start = System.currentTimeMillis();
t1.sort(null); // equivalent to Collections.sort() - in place sort
System.out.println("T1 Took: " + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
List<Integer> sortedT2 = t2.stream().sorted().collect(Collectors.toList());
System.out.println("T2 Took: " + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
List<Integer> sortedT3 = t3.parallelStream().sorted().collect(Collectors.toList());
System.out.println("T3 Took: " + (System.currentTimeMillis() - start));
}
对随机整数进行排序会导致:(显然在我的方框上)
Collections.sort() -> 4163
stream.sorted() -> 4485
parallelStream().sorted() -> 1620
几点:
Collections.sort()和List#sort将对现有列表进行排序。流API(并行和普通)将创建新的排序列表。
再次 - 流可以为空,但不能为空。似乎并行流是最快的,但是你必须记住并行流的缺陷。阅读一些信息,在这里:Should I always use a parallel stream when possible?
最后,如果你想在之前检查null,你可以编写自己的静态助手,例如:
public static <T extends Comparable<? super T>> void saveSort(final List<T> myList) {
if(myList != null) {
myList.sort(null);
}
}
public static <T> void saveSort(final List<T> myList, Comparator<T> comparator) {
if(myList != null) {
myList.sort(comparator);
}
}
我希望有所帮助!
编辑:排序的另一个Java8优势是将比较器提供为lambda:
List<Integer> test = Arrays.asList(4,2,1,3);
test.sort((i1, i2) -> i1.compareTo(i2));
test.forEach(System.out::println);