您好,欢迎访问一九零五行业门户网

Java 8中使用流和自定义比较器进行排序的方法是什么?

java8 stream排序及自定义比较器使用java 8 stream 排序 list 以及自定义对象比较器
主要比较的是时间,但是时间为最近时间,java中compareto方法比较的acsii码所以2020和2021肯定是0在前面,但是我们需要的是最近的日期在前面,所以我们对返回的结果做出来取反,正常情况 对象1的edittime和对象2的time比较的是 如果对象1的time小于对象2的time就会返回 1 ,所有我们会发现2020在前面,我们只需要取反,因为 compareto 的结果只有三种 一种是1 升序,-1降序, 0是相等的意思( string类实现了comparable接口。
compareto方法相等返回0,升序返回1,降序返回-1),这里可以理解为什么取反吗?
因为取反之后2021-09-06的就可以在前面啦。就可以按照最近时间的顺序进行排序啦。
如果有的java 8 stream 不懂的可以去看看哦list<map<string,object>> resultlist = null; map<string,object> ss1 = new hashmap<>(); ss1.put("dictcode","2"); ss1.put("dictvalue","霓虹灯广告1"); ss1.put("edittime","2021-09-16 17:47:30"); map<string,object> ss2 = new hashmap<>(); ss2.put("dictcode","1"); ss2.put("dictvalue","霓虹灯广告2"); ss2.put("edittime","2020-04-16 17:47:30"); map<string,object> ss3 = new hashmap<>(); ss3.put("dictcode","21"); ss3.put("dictvalue","霓虹灯广告3"); ss3.put("edittime","2020-09-13 17:47:30"); map<string,object> ss4 = new hashmap<>(); ss4.put("dictcode","3"); ss4.put("dictvalue","霓虹灯广告4"); ss4.put("edittime","2020-09-16 17:47:30"); map<string,object> ss5 = new hashmap<>(); ss5.put("dictcode","4"); ss5.put("dictvalue","霓虹灯广告5"); ss5.put("edittime","2020-09-16 17:47:30"); list<map<string, object>> maps = arrays.aslist(ss1, ss2, ss3, ss5, ss4); //默认按edittime排序,如果时间相同或者为空,则按照code排序 maps.stream().sorted((o1, o2) -> { if (stringutils.isempty(o1.get("edittime").tostring()) || stringutils.isempty(o2.get("edittime").tostring())) { return o1.get("dictcode").tostring().compareto(o2.get("dictcode").tostring()); } else if (o1.get("edittime").equals(o2.get("edittime"))) { return o1.get("dictcode").tostring().compareto(o2.get("dictcode").tostring()); } else if (o1.get("edittime").tostring().compareto(o2.get("edittime").tostring()) > 0) return -1; else return 1; /*if (stringutils.isempty(o1.get("edittime").tostring())||stringutils.isempty(o2.get("edittime").tostring()) || o1.get("edittime").equals(o2.get("edittime"))) { return o1.get("dictcode").tostring().compareto(o2.get("dictcode").tostring()); } else { if (o1.get("edittime").tostring().compareto(o2.get("edittime").tostring()) >0) return -1; return 1; }*/ }).collect(collectors.tolist()).foreach(system.out::println);
java stream排序问题我们在处理数据的时候经常会需要进行排序后再返回给前端调用,比如按照时间升序排序,前端展示数据就是按时间先后进行排序。
这里可以运用stream的sorted()方法来进行自定义的排序
说下用法这里举例数据是一个list集合,list<data>list,data实体类中有许多属性,其中有时间字段,month 月份,那我们用stream().sorted()方法排序时,因为元素是类引用类型,需要自定义一个比较器comparator,按month月份进行升序排序。
代码如下:
list.stream().sorted(comparator.comparing(o->new integer(o.getmonth()))).collect(collectors.tolist());
注意:
这里比较器里面参数用了lambda 表达式,new integer(o.getmonth()) ,这种封装成integer类型的是因为我们设计的data实体类中的month属性是string类型,并非integer,转换成integer是为了后续做月份遍历判断,如果属性是integer month,则可以比较器中可以直接定义类的方法引用
如下:
list.stream().sorted(comparator.comparing(data::getmonth).collect(collectors.tolist());
以上就是java 8中使用流和自定义比较器进行排序的方法是什么?的详细内容。
其它类似信息

推荐信息