假设我有一个ClassA类,并且它具有ClassB作为其属性:
public ClassA
{
private String attr;
private ClassB classB;
}
public ClassB
{
private String attr1;
private int attr2;
}
在上面的类中,是否可以使用List<ClassA> list
通过ClassB的属性对ClassA Comparator
的列表进行排序?可以通过代码Comparator.comparing(ClassA::getAttr)
轻松地按ClassA属性进行排序,但是如果我想按ClassB
中的属性对列表进行排序,又可以说attr2
属性呢?
答案 0 :(得分:3)
您可以这样做
List<ClassA> sortedList = list.stream()
.sorted(Comparator.comparing(a -> a.getClassB().getAttr2()))
.collect(Collectors.toList());
将比较的Function
传递到Comparator
,它将创建一个根据给定的stream
排序的新Comparator
。然后将其收集到List
中。
如果要处理空值,可以按照以下步骤进行操作。
final List<ClassA> sortedList = list.stream()
.sorted(Comparator.nullsFirst(
Comparator.comparing(a -> a.getClassB().getAttr1(), Comparator.nullsLast(String::compareTo))))
.collect(Collectors.toList());
答案 1 :(得分:3)
只是普通的点符号...
comparing(item -> item.getClassB().getAttr2());
...小心使用null。如果您的ClassA对象的classB属性为null,它将抛出NullPointerException。
答案 2 :(得分:0)
只需使用
Comparator.comparing(item -> item.getClassB().getAttr2())