Есть ли лучший способ сортировки коллекции в Java-8 без проверки сначала, если коллекция пуста или null?Java-8 сортировать коллекцию
if (institutions != null && !institutions.isEmpty()) {
Collections.sort(institutions);
}
Есть ли лучший способ сортировки коллекции в Java-8 без проверки сначала, если коллекция пуста или null?Java-8 сортировать коллекцию
if (institutions != null && !institutions.isEmpty()) {
Collections.sort(institutions);
}
я могу думать только 3 (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 # сортируют существующий список на месте. API потоковой передачи (как параллельный, так и обычный) создаст новые отсортированные списки.
Снова - поток может быть пустым, но он не может быть пустым. Похоже, что параллельные потоки являются самыми быстрыми, однако вы должны иметь в виду подводные камни параллельных потоков. Прочтите некоторую информацию, например. здесь: Should I always use a parallel stream when possible?
Наконец, если вы хотите, прежде чем проверить нуль, вы можете написать свой собственный статический помощник, например:
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);
}
}
Я надеюсь, что помогает!
Edit: Еще Java8 преимуществом для сортировки является обеспечение вашего компаратора, как лямбда:
Можно заметить, что 'Collections.sort' и' List.sort' сортируются на месте, а 'stream' -решения создают отсортированную копию (которая отбрасывается в вашем коде). –
@tobias_k спасибо, я принял свой ответ, чтобы отразить эти моменты. – pandaadb
Трудно найти два предложения, которые на самом деле отвечают на вопрос в этом длинном ответе, говоря о вещах, которые никогда не просили ... – Holger
Там нет необходимости проверять пустую коллекцию на всех. Лучше избегать проверки «null», никогда не позволяя коллекции быть «нулевой» в первую очередь. – Holger