java 利用 Comparator、stream sorted 实现复杂排序

描述:

对列表中5个类按 qty 属性进行升序和降序排列,如果该属性值相等,就再比较 c1 的值。

package org.example.jsonTest;

import org.example.VO.Item;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author wuy397
 * @date 2021/12/20
 */
public class Comparator比较器 {

    public static void main(String[] args) {
        Item i1 = new Item("a",1,2);
        Item i2 = new Item("b",3,3);
        Item i3 = new Item("c",3,4);
        Item i4 = new Item("d",2,4);
        Item i5 = new Item("e",3,1);


        // 升序 a d e b c    降序  c b e d a

        List<Item> l1 = Stream.of(i1,i2,i3,i4,i5).collect(Collectors.toList());

        System.out.println(l1);
        // 降序
        Comparator<Item> comparator1 = Comparator.comparing(Item::getQty).thenComparing(Item::getC1).reversed();
        // 升序
        Comparator<Item> comparator2 = Comparator.comparing(Item::getQty).thenComparing(Item::getC1);

        List<String> items1 = l1.stream().sorted(comparator1).map(Item::getName).collect(Collectors.toList());
        List<String> items2 = l1.stream().sorted(comparator2).map(Item::getName).collect(Collectors.toList());

        System.out.println("降序  ===>  "+items1);
        System.out.println("升序  ===>  "+items2);

    }
}

输出:

在这里插入图片描述

注意事项:

1、做降序时,只需要在 comparator 末尾写一个 reversed(),不需要每个比较属性都写

Comparator<Item> comparator1 =
 Comparator.comparing(Item::getQty).thenComparing(Item::getC1).reversed();

2、构建比较器时如果分两行,不能写成下列形式,否则会排序不正确
在这里插入图片描述

可以写成
在这里插入图片描述

补充:解决groupBy之后原数据顺序被打乱的问题

文章链接

data.stream().collect(Collectors.
groupingBy(Item::qty, LinkedHashMap::new, Collectors.toList()));

可以看到有三个参数,第一个参数就是key的Function了,第二个参数是一个map工厂,也就是最终结果的容器,一般默认的是采用的HashMap::new,最后一个参数很重要是一个downstream,类型是Collector,也是一个收集器,那就是说,这三个参数其实就是为了解决分组问题的

第一个参数:分组按照什么分类

第二个参数:分组最后用什么容器保存返回

第三个参数:按照第一个参数分类后,对应的分类的结果如何收集

其实一个参数的Collectors.groupingBy方法的 ,第二个参数默认是HashMap::new, 第三个参数收集器其实默认是Collectors.toList

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Systemd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值