Java8 stream 排序以及自定义比较器,很实用!

业余草

共 502字,需浏览 2分钟

 ·

2022-04-24 08:38

你知道的越多,不知道的就越多,业余的像一棵小草!

你来,我们一起精进!你不来,我和你的竞争对手一起精进!

编辑:业余草

blog.csdn.net/qq_31635851 

推荐:https://www.xttblog.com/?p=5338

阅读本文大概需要 6 分钟。

在本页中,我们将提供 java 8 Stream sorted()排序的示例。我们可以按照自然顺序和比较器提供的顺序对流进行排序。

在Java8中,可以使用lambda表达式实例化比较器(Comparator)。

我们还可以颠倒自然顺序和比较器(Comparator)提供的顺序。

自然排序使用Comparable提供的排序,该排序必须由实例为流元素的类实现。

在本页中,我们将使用java 8 Stream sorted()方法对列表List,Map和Set进行排序。

使用Stream sorted

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

下面是sorted()方法的语法

  • sorted():它使用自然顺序对流中的元素进行排序。元素类必须实现Comparable接口。
  • sorted(Comparator comparator):这里我们使用lambda表达式创建一个Comparator实例。我们可以按升序和降序对流元素进行排序。

下面的代码行将按自然顺序对列表进行排序。

list.stream().sorted()   

要反转自然顺序,Comparator提供reverseOrder()方法。

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

下面的代码行使用 Comparator 对列表进行排序。

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

为了颠倒顺序,Comparator提供reversed()方法。

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

在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 list = new ArrayList();  
  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 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

在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 set = new HashSet();  
        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()));  
    }  
}   

输出

---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 

在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 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()));  
 }  
}   

输出

---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 

下面我们要对值为自定义对象的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 map = new HashMap<>();  
  map.put(1new Student(1"Mahesh"12));  
  map.put(2new Student(2"Suresh"15));  
  map.put(3new 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

浏览 10
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报