利用stream sorted进行降序排序

 更新时间:2021年03月02日 10:39:48   作者:banjw  
这篇文章主要介绍了利用stream sorted进行降序排序,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

根据value值的大小进行降序排序,并进行截取。

public static void main(String[] args) {
  List<Map<String, Object>> list = Lists.newArrayList();
  Map<String, Object> map = Maps.newHashMap();
  map.put("id", 1);
  map.put("value", 20);
  list.add(map);
  map = Maps.newHashMap();
  map.put("id", 2);
  map.put("value", 80);
  list.add(map);
  map = Maps.newHashMap();
  map.put("id", 3);
  map.put("value", 21);
  list.add(map);
  map = Maps.newHashMap();
  map.put("id", 4);
  map.put("value", 28);
  list.add(map);
  System.out.println("原始数据:"+list);
  //根据value进行排序 得到升序排列
  list.sort(Comparator.comparing(h -> ConvertUtil.obj2Integer(h.get("value"))));
  //颠倒排序,变为降序排列
  Collections.reverse(list);
  //截取前3个
  System.out.println("结果"+list.subList(0, 3));
 }

使用1.8 stream处理

List<Map<String, Object>>result = list.stream().sorted((h1, h2) -> 
//降序
ConvertUtil.obj2Integer(h2.get("value")).compareTo(ConvertUtil .obj2Integer(h1.get("value"))))
 //前3个
    .limit(3)
    //终止流
    .collect(Collectors.toList());
 System.out.println("流结果"+result );

运行结果:

原始数据:

[{id=1, value=20}, {id=2, value=80}, {id=3, value=21}, {id=4, value=28}]

结果

[{id=2, value=80}, {id=4, value=28}, {id=3, value=21}]

补充:Java8Stream流的sorted()排序===使用Comparator排序

sorted()方法排序,一个是Comparable(自然排序),一个是Comparator接口,像Integer、String等这些基本类型的包装类已经实现了Comparable接口,

Comparable接口======》java.lang包下的

方法CompareTo(Object o),除了基本类型包装类外,一些常用的pojo类要使用CompareTo(Object o)排序,就要实现Comparable接口,在pojo类里重写compareTo()方法

Comparator接口======》java.util包下的

方法compare(Object a,Object b)

关于Comparable和Comparator接口

Sorted排序一共有两种,自然排序和Comparator接口的排序,

使用sorted()排序

1、简单List<Integer> 排序=====》

package com.it.test;
import java.util.ArrayList; 
import java.util.List;
import java.util.stream.Collectors; 
public class StreamTest {
 public static void main(String[] args) {
  List<Integer> integers = new ArrayList<>();
  integers.add(9);
  integers.add(2);
  integers.add(0);
  integers.add(4);
  integers.add(8);
  List<Integer> collect = integers.stream().sorted().collect(Collectors.toList()); //自然排序
 }
}

结果

2、简单List<String>排序

package com.it.test;
import java.util.ArrayList; 
import java.util.List;
import java.util.stream.Collectors; 
public class StreamTest {
 public static void main(String[] args) {
  List<String> strings = new ArrayList<>();
  strings.add("aa");
  strings.add("b");
  strings.add("aac");
  strings.add("bb");
  strings.add("abb");
  List<String> collect1 = strings.stream().sorted().collect(Collectors.toList());
  System.out.println(collect1.toString());
 }
}

结果

3、复杂实体对象pojo排序

使用Comparator排序

Person.java

package com.it.pojo; 
import java.util.Comparator;
import java.util.Objects; 
@Data
@NoArgsConstructor
@ToString
public class Person {
 private String name;
 private Integer age;
}
 

test.java===>先只根据年龄排序,后先根据年龄排序,再根据姓名排序,都升序

package com.it.test;
import java.util.ArrayList; 
import java.util.List;
import com.it.pojo.Person; 
import java.util.Comparator;
import java.util.stream.Collectors; 
public class StreamTest {
 public static void main(String[] args) {
  Person person1 = new Person();
  person1.setAge(21);
  person1.setName("21");
 
  Person person2 = new Person();
  person2.setAge(19);
  person2.setName("19");
 
  Person person3 = new Person();
  person3.setAge(19);
  person3.setName("20");
 
  Person person4 = new Person();
  person4.setAge(20);
  person4.setName("20");
 
  Person person5 = new Person();
  person5.setAge(19);
  person5.setName("18");
  
  List<Person> people = new ArrayList<>();
  people.add(person1);
  people.add(person2);
  people.add(person3);
  people.add(person4);
  people.add(person5);
  
  List<Person> collect1 = people.stream().sorted((Comparator.comparing(Person::getAge))).collect(Collectors.toList());//只根据年龄排序,升序
  System.out.println(collect2);
  
   List<Person> collect2 = people.stream().sorted((Comparator.comparing(Person::getAge)).reversed()).collect(Collectors.toList());//只根据年龄排序,降序
  System.out.println(collect2);
  
  List<Person> collect3 = people.stream().sorted((Comparator.comparing(Person::getAge)).thenComparing(Comparator.comparing(Person::getName))).collect(Collectors.toList());//先根据年龄进行排序,遇见相同的,然后根据姓名进行排序,都升序
  System.out.println(collect3);
 
   List<Person> collect4 = people.stream().sorted((Comparator.comparing(Person::getAge)).thenComparing(Comparator.comparing(Person::getName)).reversed()).collect(Collectors.toList());/先根据年龄进行排序,遇见相同的,然后根据姓名进行排序,降序【都降序】
  System.out.println(collect4);
 
  List<Person> collect5 = people.stream().sorted(Comparator.comparing(Person::getAge).reversed().thenComparing(Comparator.comparing(Person::getName)).reversed()).collect(Collectors.toList());//年龄升序,姓名降序
  System.out.println(collect5);
  
  List<Person> collect6 = people.stream().sorted(Comparator.comparing(Person::getAge).reversed().thenComparing(Comparator.comparing(Person::getName))).collect(Collectors.toList());//根据年龄降序,姓名升序
  System.out.println(collect6);
 }
}

结果

只根据年龄进行排序的,默认是升序

根据年龄降序

先根据年龄,后根据姓名排序的,默认都是升序

根据年龄和性别,先根据年龄,年龄相同根据性别,只在最后一个comparing上写reversed,两个排序都是降序【根据年龄降序,姓名降序】

根据年龄升序,年龄相同,根据姓名降序

总结

先这么着吧

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • 利用java生成二维码工具类示例代码

    利用java生成二维码工具类示例代码

    二维码对现在的人们来说再熟悉不过了,我们在开发的时候也经常会用到二维码,下面这篇文章主要给大家介绍了关于利用java生成二维码工具类的相关资料,文中给了详细的示例代码,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-09-09
  • 解决tk.mybatis中写自定义的mapper的问题

    解决tk.mybatis中写自定义的mapper的问题

    这篇文章主要介绍了使用tk.mybatis中写自定义的mapper的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 简单快速对@RequestParam声明的参数作校验操作

    简单快速对@RequestParam声明的参数作校验操作

    这篇文章主要介绍了简单快速对@RequestParam声明的参数作校验操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 使用Spring Security控制会话的方法

    使用Spring Security控制会话的方法

    在本文中,我们将说明Spring Security如何允许我们控制HTTP会话。这篇文章主要介绍了使用Spring Security控制会话 ,需要的朋友可以参考下
    2019-05-05
  • java图搜索算法之图的对象化描述示例详解

    java图搜索算法之图的对象化描述示例详解

    这篇文章主要为大家介绍了java图搜索算法之图的对象化描述示例详解,可以带你秒杀所有的图搜索算法,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-11-11
  • 深入学习 Java 中的 Lambda

    深入学习 Java 中的 Lambda

    Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。,需要的朋友可以参考下
    2019-06-06
  • Java中的forEach循环详细解读

    Java中的forEach循环详细解读

    这篇文章主要介绍了Java中的forEach循环详细解读,不要再foreach循环里面进行元素的add和remove,如果你非要进行remove元素,那么请使用Iterator方式,如果存在并发,那么你一定要选择加锁,需要的朋友可以参考下
    2023-12-12
  • MyBatis-plus数据库字段排序不准确的解决

    MyBatis-plus数据库字段排序不准确的解决

    这篇文章主要介绍了MyBatis-plus数据库字段排序不准确的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • spring的几个重要类和接口(详解)

    spring的几个重要类和接口(详解)

    下面小编就为大家带来一篇spring的几个重要类和接口(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • 如何为Spring Cloud Gateway加上全局过滤器

    如何为Spring Cloud Gateway加上全局过滤器

    这篇文章主要介绍了如何为Spring Cloud Gateway加上全局过滤器,帮助大家更好得理解和学习使用Gateway,感兴趣的朋友可以了解下
    2021-03-03

最新评论