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

  • 1.使用Stream sorted()完成自然排序、比较器和反向排序
  • 2.在List中使用Stream sorted()方法
  • 3.在Set中使用Stream sorted()方法
  • 4.在Map中使用Stream sorted()方法


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

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

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

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

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

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

下面是sorted()方法的语法

  • sorted():它使用自然顺序对流中的元素进行排序。元素类必须实现Comparable接口。
  • sorted(Comparator<? super T> 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()) 

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能。

项目地址:https://github.com/YunaiV/ruoyi-vue-pro

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 

基于微服务的思想,构建在 B2C 电商场景下的项目实战。核心技术栈,是 Spring Boot + Dubbo 。未来,会重构成 Spring Cloud Alibaba 。

项目地址:https://github.com/YunaiV/onemall

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

输出

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

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

输出

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

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值