Comparator.comparing嵌套对象倒序以及多重条件排序

这篇具有很好参考价值的文章主要介绍了Comparator.comparing嵌套对象倒序以及多重条件排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、嵌套对象倒序的正确书写方式

描述:对象A内部封装对象B,根据B的字段做倒排

Comparator<User> ageDescCom = Comparator.comparing(temp -> temp.getKid().getAge()).reversed();//报错:temp为object
Comparator<User> ageDescCom = Comparator.comparing((User temp) -> temp.getKid().getAge()).reversed();//有效
Comparator<User> ageDescCom = Comparator.comparing(temp -> temp.getKid().getAge(), Comparator.reverseOrder());//有效

测试代码:

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User extends BaseEntity {
    String nickname;
    String avatar;
    Integer gender;
    Integer age;
    User kid;

    @Override
    public User instance() {
        return new User();
    }
}

public class ComparatorTest {
    @Test
    public void test() {
        User kid = User.builder().age(1).build();
        User kid1 = User.builder().age(2).build();
        User kid2 = User.builder().age(3).build();
        User kid3 = User.builder().age(4).build();
        User kid4 = User.builder().age(5).build();

        User user = User.builder().kid(kid).build();
        User user1 = User.builder().kid(kid1).build();
        User user2 = User.builder().kid(kid2).build();
        User user3 = User.builder().kid(kid3).build();
        User user4 = User.builder().kid(kid4).build();

        List<User> list = Arrays.asList(user2,user3,user1,user,user4);
        System.out.println(list);
        //Comparator<User> ageDescCom = Comparator.comparing(temp -> temp.getKid().getAge()).reversed();//报错:temp为object
        //Comparator<User> ageDescCom = Comparator.comparing((User temp) -> temp.getKid().getAge()).reversed();//有效
        //Comparator<User> ageDescCom = Comparator.comparing(temp -> temp.getKid().getAge(), Comparator.reverseOrder());//有效
        list = list.stream().sorted(ageDescCom).collect(Collectors.toList());
        System.out.println(list);
    }
    
}

二、多层/嵌套/多重条件排序

描述:如:先按照年龄正序,同年龄按照体重倒序。文章来源地址https://www.toymoban.com/news/detail-578505.html

Comparator<XXX> A = Comparator.comparing(XXX::getAge).reversed();
Comparator<XXX> B = Comparator.comparing(XXX::getWeight);
Comparator<XXX> C = A.thenComparing(B);

测试代码:

public class ComparatorTest {

    @Test
    public void test2() {
        User kid = User.builder().age(4).weight(1).build();
        User kid1 = User.builder().age(4).weight(2).build();
        User kid2 = User.builder().age(4).weight(3).build();
        User kid3 = User.builder().age(4).weight(4).build();
        User kid4 = User.builder().age(4).weight(5).build();

        User user = User.builder().age(20).kid(kid).build();
        User user1 = User.builder().age(20).kid(kid1).build();
        User user2 = User.builder().age(20).kid(kid2).build();
        User user3 = User.builder().age(20).kid(kid3).build();
        User user4 = User.builder().age(20).kid(kid4).build();

        List<User> list = Arrays.asList(user2,user3,user1,user,user4);
        System.out.println(list);

        Comparator<User> userAgeAscCom = Comparator.comparing(User::getAge);
        Comparator<User> kidAgeAscCom = Comparator.comparing(User::getAge);
        Comparator<User> kidWeightDescCom = Comparator.comparing(temp -> temp.getKid().getWeight(), Comparator.reverseOrder());
        Comparator<User> userAgeAscThenKidWeightDescCom = userAgeAscCom.thenComparing(kidWeightDescCom);//父母年龄正序后小孩体重倒序
        Comparator<User> kidAgeAscThenKidWeightDescCom = kidAgeAscCom.thenComparing(kidWeightDescCom);//小孩年龄正序后小孩体重倒序

        list = list.stream().sorted(userAgeAscThenKidWeightDescCom).collect(Collectors.toList());
        System.out.println(list);
        list = list.stream().sorted(kidAgeAscThenKidWeightDescCom).collect(Collectors.toList());
        System.out.println(list);
    }

}

到了这里,关于Comparator.comparing嵌套对象倒序以及多重条件排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于Comparable、Comparator接口返回值决定顺序的问题

    Comparable和Comparator接口都是实现集合中元素的比较、排序的,下面先简单介绍下他们的用法。 以上的两个例子输出的结果如下所示: 按照年龄升序排列,年龄相同时按照姓名升序排序。 在上面的例子中我们分别实现了 compare() 和 compareTo() 对集合继续宁排序,但是我们想知道

    2024年02月10日
    浏览(15)
  • Comparator.comparing()实现中文排序及空指针处理

      Comparator用法_乞力马扎罗の黎明的博客-CSDN博客 1、中文排序、空值处理   Collator instance = Collator.getInstance(Locale.CHINA);   checkItemVoList.stream().sorted(Comparator.comparing(DevCheckItemVo::getCheckLevel, Comparator.nullsLast(Integer::compareTo)).thenComparing(DevCheckItem::getCheckName, Comparator.nullsLast(String::com

    2024年02月17日
    浏览(10)
  • 内置函数式接口-Comparator

    【 美 /ˈkɑːmpəˌreɪtər; kəmˈpærətər/】 比较器 Compares its two arguments (o1,o2) for order,Returns a integer。 1、 negative integer, first argument is less than the second → 0 o1o2 2、 zero, first argument i, equal to than the second → =0 o1=o2 3、 positive integer ,first argument is greater than the second → 0 o1o2

    2024年02月15日
    浏览(12)
  • java自然排序Comparable和比较器排序Comparator

    案例需求 存储学生对象并遍历,创建TreeSet集合使用无参构造方法 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序 实现步骤 使用空参构造创建TreeSet集合 用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的 自定义的Student类实

    2024年02月07日
    浏览(50)
  • 【java常用接口】Comparator学习

    Comparator 是 Java 中的一个接口,用于定义对象之间的排序规则。它可以用于对集合中的对象进行排序,或者用于自定义排序算法。 对集合中的对象进行排序。 自定义排序算法。 结合 Stream流 实现更便捷的排序操作。 实现 Comparator 接口:创建一个类,实现 Comparator 接口,并重

    2024年01月21日
    浏览(32)
  • Java比较器(Comparator接口)

    1.当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用 Comparator 的对象来排序 2.重写compare(Object o1,Object o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回

    2024年02月15日
    浏览(13)
  • JAVA语言-比较器Comparator

    目录 一、什么是Comparator 二、Java compare方法和compareTo方法 三、java中Comparable和Comparator的区别 Comparator的例子 Comparator 是javase中的接口,位于java.util包下。 数组工具类和集合工具类中提供的工具方法sort方法都给出了含有Comparator接口的重载方法。 List实例调sort方法 demo如下: 使

    2024年02月06日
    浏览(16)
  • Java中的比较器(Comparator)

    Java中的比较器(Comparator)是一种对象,用于定义两个对象之间的比较规则。它是一个独立的类,实现了Comparator接口,通常用于对集合中的元素进行排序。Comparator接口中有一个compare()方法,它接受两个对象作为参数,并返回一个int值,表示它们的顺序。 下面是一个简单的例

    2024年02月11日
    浏览(12)
  • 可能是最简单最通透的Comparable和Comparator接口返回值理解

    先说 Comparator 接口,这个理解了,下一个就理解了 返回-1,1交换不交换位置,如果撇开比较器的两个参数和jdk默认顺序来说,存粹是错误的 接口如下:原文链接 现提出如下标准: 标准1:jdk 默认要升序排列,即程序排序规则是 asc ,升序排列 标准2: Comparator 接口第一个参数

    2024年02月08日
    浏览(20)
  • Java入门8(Comparator比较器,HashMap)

    ​Comparator不同于Comparable,使用更加的灵活,可以在不同场景下使用比较器,实际开发中,更推荐comparator比较器 Set接口常用实现类 三个常用实现类:TreeSet(基于Java红黑树,底层map),HashSet(哈希表,底层map),LinkedHashSet() Set特点: 不允许存储重复元素 没有索引,不能

    2024年02月04日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包