Comparator#comparing 按class属性的属性排序
Comparator#comparing sort by the attribute of the class attribute
假设我有一个 class ClassA,它的属性是 ClassB:
public ClassA
{
private String attr;
private ClassB classB;
}
public ClassB
{
private String attr1;
private int attr2;
}
根据上面的class,是否可以使用Comparator
按ClassB 的属性对ClassA List<ClassA> list
的列表进行排序?它可以通过代码 Comparator.comparing(ClassA::getAttr)
轻松地按 ClassA 属性排序,但是如果我想按 ClassB
中的属性对列表进行排序,比如说 attr2
属性怎么办?
你可以这样做,
List<ClassA> sortedList = list.stream()
.sorted(Comparator.comparing(a -> a.getClassB().getAttr2()))
.collect(Collectors.toList());
将比较 Function
传递给 Comparator
,它将创建一个根据给定 Comparator
排序的新 stream
。然后收藏成一个List
.
如果你想处理空值,可以像下面那样完成。
final List<ClassA> sortedList = list.stream()
.sorted(Comparator.nullsFirst(
Comparator.comparing(a -> a.getClassB().getAttr1(), Comparator.nullsLast(String::compareTo))))
.collect(Collectors.toList());
只是普通的点符号...
comparing(item -> item.getClassB().getAttr2());
...请注意空值。如果您的 ClassA 对象的 classB 属性为 null,它将抛出 NullPointerException。
只需使用
Comparator.comparing(item -> item.getClassB().getAttr2())
假设我有一个 class ClassA,它的属性是 ClassB:
public ClassA
{
private String attr;
private ClassB classB;
}
public ClassB
{
private String attr1;
private int attr2;
}
根据上面的class,是否可以使用Comparator
按ClassB 的属性对ClassA List<ClassA> list
的列表进行排序?它可以通过代码 Comparator.comparing(ClassA::getAttr)
轻松地按 ClassA 属性排序,但是如果我想按 ClassB
中的属性对列表进行排序,比如说 attr2
属性怎么办?
你可以这样做,
List<ClassA> sortedList = list.stream()
.sorted(Comparator.comparing(a -> a.getClassB().getAttr2()))
.collect(Collectors.toList());
将比较 Function
传递给 Comparator
,它将创建一个根据给定 Comparator
排序的新 stream
。然后收藏成一个List
.
如果你想处理空值,可以像下面那样完成。
final List<ClassA> sortedList = list.stream()
.sorted(Comparator.nullsFirst(
Comparator.comparing(a -> a.getClassB().getAttr1(), Comparator.nullsLast(String::compareTo))))
.collect(Collectors.toList());
只是普通的点符号...
comparing(item -> item.getClassB().getAttr2());
...请注意空值。如果您的 ClassA 对象的 classB 属性为 null,它将抛出 NullPointerException。
只需使用
Comparator.comparing(item -> item.getClassB().getAttr2())