當涉及到排序時,Java 8 Stream是一個非常強大的工具。它提供了許多方便的方法來排序列表,包括自然排序、定製排序和並行排序。在這篇文章中,我們將探討Java 8 Stream排序的不同方面。
一、自然排序
Java 8 Stream的自然排序方法非常簡單。可以簡單地調用sort()方法來按照元素自然順序(升序)排序流。下面是示例代碼:
List<Integer> numbers = Arrays.asList(3, 2, 5, 4, 1); numbers.stream().sorted().forEach(System.out::println);
這將輸出:1 2 3 4 5
我們也可以通過改變先後順序來實現降序排列。下面是示例代碼:
List<Integer> numbers = Arrays.asList(3, 2, 5, 4, 1); numbers.stream().sorted(Comparator.reverseOrder()).forEach(System.out::println);
這將輸出:5 4 3 2 1
二、定製排序
Java 8 Stream提供了一種非常方便的方法來進行定製排序。在定製排序中,我們可以使用Comparator來指定我們自定義的比較方法。下面是示例代碼:
List<String> names = Arrays.asList("John", "Doe", "Jane", "David"); names.stream().sorted((s1, s2) -> s1.compareToIgnoreCase(s2)).forEach(System.out::println);
這將按照字母順序(忽略大小寫)輸出:David Doe Jane John
定製排序還允許我們在排序時指定多個條件。例如,我們可以對人員列表按姓氏和名字進行排序。下面是示例代碼:
List<Person> persons = Arrays.asList( new Person("John", "Doe"), new Person("Jane", "Doe"), new Person("David", "Smith"), new Person("John", "Smith") ); persons.stream().sorted(Comparator.comparing(Person::getLastName).thenComparing(Person::getFirstName)).forEach(System.out::println);
這將按照姓氏和名字的順序輸出人員列表。
三、並行排序
Java 8 Stream通過parallel()方法支持並行排序,可以發揮多核CPU的優勢,提高排序速度。下面是示例代碼:
List<Integer> numbers = Arrays.asList(3, 2, 5, 4, 1); numbers.parallelStream().sorted().forEach(System.out::println);
並行排序還可以與定製排序相結合。下面是示例代碼:
List<Person> persons = Arrays.asList( new Person("John", "Doe"), new Person("Jane", "Doe"), new Person("David", "Smith"), new Person("John", "Smith") ); persons.parallelStream().sorted(Comparator.comparing(Person::getLastName).thenComparing(Person::getFirstName)).forEach(System.out::println);
這將並行排序並輸出排序結果。
四、流中排除null元素的排序
通過Java 8 Stream排序,可以輕鬆排除流中的null元素。下面是示例代碼:
List<Integer> numbers = Arrays.asList(null, 3, null, 2, 5, null, 4, 1); numbers.stream().filter(Objects::nonNull).sorted().forEach(System.out::println);
這將輸出:1 2 3 4 5
五、總結
本文探討了Java 8 Stream排序的各個方面。我們了解了自然排序、定製排序、並行排序和流中排除null元素的排序。使用Stream來排序,可以讓代碼更簡潔、更易讀、更高效。因此,Stream已成為Java 8編程中不可或缺的一個工具。
原創文章,作者:AQOR,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/138516.html