当前位置: 首页 > 知识库问答 >
问题:

Java8:按属性排序对象列表,无需自定义比较器

包丁雨
2023-03-14

要做到这一点,最干净的捷径是什么?

class AnObject{
    Long  attr;
}

List<AnObject> list; 

我知道它可以通过自定义比较器来实现。对于这种情况,难道没有现成的东西吗?

有点像这样:

Collections.sort(list, X.attr);

共有3个答案

司徒隐水
2023-03-14

JB Nizet和Alex上述答案的空安全选项是执行以下操作:

list.sort(Comparator.comparing(AnObject::getAttr, Comparator.nullsFirst(Comparator.naturalOrder())));

list.sort(Comparator.comparing(AnObject::getAttr, Comparator.nullsLast(Comparator.naturalOrder())));
卜昂熙
2023-03-14

作为对@JB Nizet答案的补充,如果您的attr可为null,

list.sort(Comparator.comparing(AnObject::getAttr));

可能会抛出NPE。

如果您还想对null值进行排序,可以考虑

    list.sort(Comparator.comparing(a -> a.attr, Comparator.nullsFirst(Comparator.naturalOrder())));

    list.sort(Comparator.comparing(a -> a.attr, Comparator.nullsLast(Comparator.naturalOrder())));

这将首先或最后放置空值。

蒋鹏鹍
2023-03-14

假设你真的有一个<代码>列表

list.sort(Comparator.comparing(a -> a.attr));

如果您不使用公共字段,而是使用访问器方法,从而使代码变得更干净:

list.sort(Comparator.comparing(AnObject::getAttr));
 类似资料:
  • 我有两个包含该类对象的列表: 我想通过学生比较一下那两个列表中的对象。我得比较一下列表然后得到下面的数据 我需要创建一个新列表,其中包含中存在但不在中的 对象 我需要创建一个新列表,其中包含那些对象,这些对象存在于中,但不存在于中 我需要创建一个新列表,其中包含使用java8流出现在两个列表中的对象 我尝试使用下面的代码 查找获得TC的学生(存在于列表1中但不存在于列表2中) 查找新的许可(存在于

  • 我读过关于使用比较器对数组列表进行排序的文章,但在所有示例中,人们都使用了,根据一些研究,这是一种用于字符串的方法。 我希望按照自定义对象的属性之一对其ArrayList进行排序:日期对象()。通常我会通过来比较它们,所以我想知道我是否可以写出如下内容:

  • 问题内容: 我知道有几个这样的问题,但是它们似乎对我没有用。 我有一个列表,5元素乘以50。我想通过对每个元素应用自定义比较功能来对列表进行排序。此函数计算要对元素进行排序的列表的适用性。我创建了两个函数,比较和适应性: 和 然后我尝试通过以下方式致电给他们: 要么 要么 要么 我也尝试了具有相同参数的list.sort()。但是无论如何,函数都不会将列表作为参数,而是作为参数。我不知道为什么,这

  • 问题内容: 我想按对象的指定属性对对象列表进行排序,并希望选择用于排序的属性。例: 这个想法很简单: 我将要排序的所有值都放入一个数组中,并创建了一个映射,将这些值映射回它们的对象。对这个数组进行排序后,我将映射到这些值的对象按相同的顺序放入一个新数组中,然后按这些值对它们进行排序。这些值只是使用Object类型创建的,因此我可以按多种类型(不仅仅是示例中的Strings)进行排序。 除非您有两个

  • 我有一个对象列表,我需要按其中一个对象属性对其进行排序。 我可以用下面的代码按升序排序 但是,这是按升序排序列表,而我需要做的是按降序排序。在对对象列表进行排序时,这可能吗?

  • 如何使用Comparator对对象的ArrayList进行正确排序,然后将排序后的数组传递给自定义数组适配器? 我试过这样做: ArrayList的内容类: 比较器: 在OnCreate中设置适配器: ...因为我使用的是定制的ArrayAdapter,就像: 我需要如何修改此适配器以使其与其他适配器一起工作? 谢谢你的帮助。