【Java 8 新特性】Java 8 Stream使用sorted()方法自定義排序的示例


 

在本頁中,我們將提供 java 8 Stream sorted()排序的示例。

我們可以按照自然順序和比較器提供的順序對流進行排序。

Java8中,可以使用lambda表達式實例化比較器(Comparator)。

我們還可以顛倒自然順序和比較器(Comparator)提供的順序。

自然排序使用Comparable提供的排序,該排序必須由實例為流元素的類實現。

在本頁中,我們將使用java 8 Stream sorted()方法對列表List, MapSet進行排序。

1.使用Stream sorted()完成自然排序、比較器和反向排序

下面是sorted()方法的語法

  1. sorted():它使用自然順序對流中的元素進行排序。元素類必須實現Comparable接口。
  2. sorted(Comparator<? super T> comparator):這里我們使用lambda表達式創建一個Comparator實例。我們可以按升序和降序對流元素進行排序。

下面的代碼行將按自然順序對列表進行排序。

list.stream().sorted() 
  • 1

要反轉自然順序,Comparator提供reverseOrder()方法。

list.stream().sorted(Comparator.reverseOrder()) 
  • 1

下面的代碼行使用Comparator對列表進行排序。

list.stream().sorted(Comparator.comparing(Student::getAge)) 
  • 1

為了顛倒順序,Comparator提供reversed()方法。

list.stream().sorted(Comparator.comparing(Student::getAge).reversed()) 
  • 1

2.在List中使用Stream sorted()方法

下面我們對Student列表進行排序操作。首先,我們將按自然順序排序,然后使用比較器(Comparator)。

下面是顛倒自然排序和比較器提供的排序的例子。

SortList.java

package com.concretepage; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; public class SortList { public static void main(String[] args) { List<Student> list = new ArrayList<Student>(); list.add(new Student(1, "Mahesh", 12)); list.add(new Student(2, "Suresh", 15)); list.add(new Student(3, "Nilesh", 10)); System.out.println("---Natural Sorting by Name---"); List<Student> slist = list.stream().sorted().collect(Collectors.toList()); slist.forEach(e -> System.out.println("Id:"+ e.getId()+", Name: "+e.getName()+", Age:"+e.getAge())); System.out.println("---Natural Sorting by Name in reverse order---"); slist = list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList()); slist.forEach(e -> System.out.println("Id:"+ e.getId()+", Name: "+e.getName()+", Age:"+e.getAge())); System.out.println("---Sorting using Comparator by Age---"); slist = list.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList()); slist.forEach(e -> System.out.println("Id:"+ e.getId()+", Name: "+e.getName()+", Age:"+e.getAge())); System.out.println("---Sorting using Comparator by Age with reverse order---"); slist = list.stream().sorted(Comparator.comparing(Student::getAge).reversed()).collect(Collectors.toList()); slist.forEach(e -> System.out.println("Id:"+ e.getId()+", Name: "+e.getName()+", Age:"+e.getAge())); } } 

 

Student.java

package com.concretepage; public class Student implements Comparable<Student> { private int id; private String name; private int age; public Student(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } public int getId() { return id; } public String getName() { return name; } public int getAge() { return age; } @Override public int compareTo(Student ob) { return name.compareTo(ob.getName()); } @Override public boolean equals(final Object obj) { if (obj == null) { return false; } final Student std = (Student) obj; if (this == std) { return true; } else { return (this.name.equals(std.name) && (this.age == std.age)); } } @Override public int hashCode() { int hashno = 7; hashno = 13 * hashno + (name == null ? 0 : name.hashCode()); return hashno; } } 

 

 

輸出

---Natural Sorting by Name---
Id:1, Name: Mahesh, Age:12
Id:3, Name: Nilesh, Age:10
Id:2, Name: Suresh, Age:15
---Natural Sorting by Name in reverse order--- Id:2, Name: Suresh, Age:15 Id:3, Name: Nilesh, Age:10 Id:1, Name: Mahesh, Age:12 ---Sorting using Comparator by Age--- Id:3, Name: Nilesh, Age:10 Id:1, Name: Mahesh, Age:12 Id:2, Name: Suresh, Age:15 ---Sorting using Comparator by Age with reverse order--- Id:2, Name: Suresh, Age:15 Id:1, Name: Mahesh, Age:12 Id:3, Name: Nilesh, Age:10 

 

3.在Set中使用Stream sorted()方法

下面我們對Student類的集合(Set)進行排序操作,此類必須重寫equals()hashCode()方法來標識唯一的元素。

對於自然排序,學生類需要實現Comparable接口。

在下面的例子中,我們將使用自然排序和比較器提供的排序對集合進行排序。

SortSet.java

package com.concretepage; import java.util.Comparator; import java.util.HashSet; import java.util.Set; public class SortSet { public static void main(String[] args) { Set<Student> set = new HashSet<Student>(); set.add(new Student(1, "Mahesh", 12)); set.add(new Student(2, "Suresh", 15)); set.add(new Student(3, "Nilesh", 10)); System.out.println("---Natural Sorting by Name---"); set.stream().sorted().forEach(e -> System.out.println("Id:" + e.getId()+", Name: "+e.getName()+", Age:"+e.getAge())); System.out.println("---Natural Sorting by Name in reverse order---"); set.stream().sorted(Comparator.reverseOrder()).forEach(e -> System.out.println("Id:" + e.getId()+", Name: "+e.getName()+", Age:"+e.getAge())); System.out.println("---Sorting using Comparator by Age---"); set.stream().sorted(Comparator.comparing(Student::getAge)) .forEach(e -> System.out.println("Id:"+ e.getId()+", Name: "+e.getName()+", Age:"+e.getAge())); System.out.println("---Sorting using Comparator by Age in reverse order---"); set.stream().sorted(Comparator.comparing(Student::getAge).reversed()) .forEach(e -> System.out.println("Id:"+ e.getId()+", Name: "+e.getName()+", Age:"+e.getAge())); } } 
  • 1

輸出

---Natural Sorting by Name---
Id:1, Name: Mahesh, Age:12
Id:3, Name: Nilesh, Age:10
Id:2, Name: Suresh, Age:15
---Natural Sorting by Name in reverse order--- Id:2, Name: Suresh, Age:15 Id:3, Name: Nilesh, Age:10 Id:1, Name: Mahesh, Age:12 ---Sorting using Comparator by Age--- Id:3, Name: Nilesh, Age:10 Id:1, Name: Mahesh, Age:12 Id:2, Name: Suresh, Age:15 ---Sorting using Comparator by Age in reverse order--- Id:2, Name: Suresh, Age:15 Id:1, Name: Mahesh, Age:12 Id:3, Name: Nilesh, Age:10 
  • 1
  • 2

4.在Map中使用Stream sorted()方法

這里我們將按鍵和值對Map進行排序。

SortMap.java

package com.concretepage; import java.util.Comparator; import java.util.HashMap; import java.util.Map; public class SortMap { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); map.put(15, "Mahesh"); map.put(10, "Suresh"); map.put(30, "Nilesh"); System.out.println("---Sort by Map Value---"); map.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getValue)) .forEach(e -> System.out.println("Key: "+ e.getKey() +", Value: "+ e.getValue())); System.out.println("---Sort by Map Key---"); map.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getKey)) .forEach(e -> System.out.println("Key: "+ e.getKey() +", Value: "+ e.getValue())); } } 
  • 1

輸出

---Sort by Map Value---
Key: 15, Value: Mahesh
Key: 30, Value: Nilesh
Key: 10, Value: Suresh
---Sort by Map Key---
Key: 10, Value: Suresh
Key: 15, Value: Mahesh
Key: 30, Value: Nilesh 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

下面我們要對值為自定義對象的Map進行排序。

SortMapOfCustomObject.java

package com.concretepage; import java.util.Comparator; import java.util.HashMap; import java.util.Map; public class SortMapOfCustomObject { public static void main(String[] args) { Map<Integer, Student> map = new HashMap<>(); map.put(1, new Student(1, "Mahesh", 12)); map.put(2, new Student(2, "Suresh", 15)); map.put(3, new Student(3, "Nilesh", 10)); //Map Sorting by Value i.e student's natural ordering i.e by name map.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getValue)) .forEach(e -> { Integer key = (Integer)e.getKey(); Student std = (Student)e.getValue(); System.out.println("Key: " + key +", value: ("+ std.getId() +", "+ std.getName()+", "+ std.getAge()+")"); }); } } 

 

輸出

Key: 1, value: (1, Mahesh, 12) Key: 3, value: (3, Nilesh, 10) Key: 2, value: (2, Suresh, 15) 

原創: @


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM