Java-8对集合进行排序

时间:2016-08-22 12:14:00

标签: java-8

有没有更好的方法在Java-8中对集合进行排序,而不先检查集合是空还是空?

if (institutions != null && !institutions.isEmpty()) {
        Collections.sort(institutions);
    }

2 个答案:

答案 0 :(得分:1)

尽管这个问题很古老,但只是添加了另一种解决方法。 首先,集合不应为null。如果是这样:

institutions.sort(Comparator.comparing(Institutions::getId));

答案 1 :(得分:0)

我只能想到三(4)种方式:

  1. 使用SortedSet(例如TreeSet)并将其插入其中。元素将立即排序,但插入时间可能不好。此外,您不能拥有相同的元素(例如3x 1),因此它可能不是最佳解决方案。
  2. 然后是普通的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);