热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java8streamsort自定义复杂排序案例

这篇文章主要介绍了java8streamsort自定义复杂排序案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

java 8 自定义排序

需求

今天在项目中遇到个需求,按照对象中的三个属性进行排序。

具体要求:

前提:对象 Obj [a=a,b=b,c=c]

1、 优先级为a > b > c

2、 a属性为中文,固定排序规则为:政府,合作,基金 … …

3、 b的为BigDecimal类型,固定的排序规则为:降序排序

4、 c为java.util.Date类型,规则为:降序排序

其实看这个需求,第3点和第4点不是什么问题,但是第1点,会考虑下怎么实现好。

直接上方案吧!

方案一

新建一张排序表,至少要有字段 【名称—中文名称(政府、合作、基金等)】【排序编号—(1、2、3)】,在Obj表中的a字段存排序表的id。

此时可以直接用sql语句 ORDER BY 排序即可。

优点:可动态配置。

方案二

完全用java代码操作,和sql无关,上代码:

Obj.java 和 Sort.java

package TestSort;
import java.math.BigDecimal;
public class Obj {
 private String name;
 private BigDecimal price;
 public Obj(String name, BigDecimal price){
 this.name = name;
 this.price = price;
 }
 
 public Obj(){
 
 }
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public BigDecimal getPrice() {
 return price;
 }
 public void setPrice(BigDecimal price) {
 this.price = price;
 }
 @Override
 public String toString() {
 return "Obj [name=" + name + ", price=" + price + "]";
 } 
}
package TestSort;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class Sort {
 
 public static void main(String[] args) {
 List list = Arrays.asList(
  new Obj("政府", null),
  new Obj("政府", new BigDecimal("1216.23")),
  new Obj("商业", new BigDecimal("123.23")),
  new Obj("PPD", new BigDecimal("123.23")),
  new Obj("合作", new BigDecimal("127.23")),
  new Obj("合作", new BigDecimal("125.23")),
  new Obj("咨询", null),
  new Obj(null, null)
  );
 
 /*Comparator byName = Comparator.comparing(Obj::getName).reversed();
 
 Comparator finalByPrice= byName.thenComparing(Obj::getPrice,Comparator.nullsFirst(BigDecimal::compareTo)).reversed();
 
 List result = list.stream().filter(new Predicate() {
    @Override
    public boolean test(Obj obj) {
    if(obj.getName() == null && obj.getPrice() ==null){
     return false;
    }
    return true;
    }
   }).sorted(finalByPrice).collect(Collectors.toList());*/
 
 List result = list.stream().sorted(
     //先按照name排序(模拟需求的a属性排序)
  Comparator.comparing(Obj::getName,(x,y)->{
   if(x == null && y != null){
   return 1;
   }else if(x !=null && y == null){
   return -1;
   }else if(x == null && y == null){
   return -1;
   }else if("PPD".equals(x) || "PPD".equals(y)){
   if(x.equals(y)){
    return 0;
   }else if("PPD".equals(x)){
    return -1;
   }else{
    return 1;
   }
   }else
   if("合作".equals(x) || "合作".equals(y)){
   if(x.equals(y)){
    return 0;
   }else if("合作".equals(x)){
    return -1;
   }else{
    return 1;
   }
   }else
   if("政府".equals(x) || "政府".equals(y)){
   if(x.equals(y)){
    return 0;
   }else if("政府".equals(x)){
    return -1;
   }else{
    return 1;
   }
   }
   return 0; })
     //再按照其他字段排序,要考虑null(模拟需求b和c字段排序)
     .thenComparing(Comparator.comparing(Obj::getPrice,
     Comparator.nullsFirst(BigDecimal::compareTo)).reversed()
  )).collect(Collectors.toList());
 System.out.println(result);
 System.out.println(result.size());
 }
 }

方案二的缺点就是硬编码,用户改排序就得改源码。对第二种方案的改进:

package TestSort;
 
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
 
public class Sort {
 public static void main(String[] args) {
 List list = Arrays.asList(
  new Obj("政府", null),
  new Obj("政府", new BigDecimal("1216.23")),
  new Obj("商业", new BigDecimal("123.23")),
  new Obj("PPD", new BigDecimal("123.23")),
  new Obj("合作", new BigDecimal("127.23")),
  new Obj("合作", new BigDecimal("125.23")),
  new Obj("咨询", null),
  new Obj(null, null)
  );
 /*Comparator byName = Comparator.comparing(Obj::getName).reversed();
 Comparator finalByPrice= byName.thenComparing(Obj::getPrice,Comparator.nullsFirst(BigDecimal::compareTo)).reversed();
 List result = list.stream().filter(new Predicate() {
    @Override
    public boolean test(Obj obj) {
    if(obj.getName() == null && obj.getPrice() ==null){
     return false;
    }
    return true;
    }
   }).sorted(finalByPrice).collect(Collectors.toList());*/
 //此处模拟从数据读取配置到list
 List sortList = Arrays.asList("PPD","政府","合作");
 list.stream().sorted(
  Comparator.comparing(Obj::getName,(x,y)->{
   if(x == null && y != null){
   return 1;
   }else if(x !=null && y == null){
   return -1;
   }else if(x == null && y == null){
   return -1;
   }else{
   //按照读取的list顺序排序
   for(String sort : sortList){
    if(sort.equals(x) || sort.equals(y)){
    if(x.equals(y)){
     return 0;
    }else if(sort.equals(x)){
     return -1;
    }else{
     return 1;
    }
    }
   }
   return 0;
   }
  }).thenComparing(Comparator.comparing(Obj::getPrice,Comparator.nullsFirst(BigDecimal::compareTo)).reversed())
  ).collect(Collectors.toList()).forEach(System.out::println);;
 }
 }

补充知识:java8 stream代替for循环 sort多字段排序 group by多级排序

我就废话不多说了,大家还是直接看代码吧`

List list = new ArrayList();
Category ctg= new Category();
ctg.setType(1);//0商品,1销售规格
ctg.setSort(2);
ctg.setInheritFlag(0);//0继承属性1非继承属性
ctg.setValueSort(1)
Category ctg1= new Category();
ctg1.setType(0);//0商品,1销售规格
ctg1.setSort(1);
ctg1.setInheritFlag(1);//0继承属性1非继承属性
ctg1.setValueSort(2)
list.add(ctg);
list.add(ctg1);
        lista.stream().sorted(Comparator.comparing(Category::getSort()).thenComparing(Category::getValueSort())).collect(Collectors.groupingBy(fetchGroupInheritKey(mtg)),Collectors.groupingBy(fetchGroupTypeKey(mtg)));
private String fetchGroupInheritKey(Category ctg){
        if(inheritFlag==0){
          return "inheritList";
        }else if(inheritFlag==1){
          return "ownList";
        }else{
          return "";
        }
        
      }

使用Comparator实现多字段排序和多级分组,前面的sort排序会影响后面的groupBy分组后的list中的排序

mcvo中有有多个property List ,按商品属性和销售属性区分将多个小list聚合为一个list

mc V o list.stream(). flat Map(mc vo→mcvo.getPropertyList(). stream ())

以上这篇java8 stream sort自定义复杂排序案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


推荐阅读
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Echarts图表重复加载、axis重复多次请求问题解决记录
    文章目录1.需求描述2.问题描述正常状态:问题状态:3.解决方法1.需求描述使用Echats实现了一个中国地图:通过选择查询周期&#x ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • Python字典推导式及循环列表生成字典方法
    本文介绍了Python中使用字典推导式和循环列表生成字典的方法,包括通过循环列表生成相应的字典,并给出了执行结果。详细讲解了代码实现过程。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • “你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间,这是我们最战战兢兢的心情。但是显然,有些人体会不了。这份行业数据,让笔者“柠檬” ... [详细]
author-avatar
杨幂-real-perfectpb_852
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有