novato:
Digamos que tengo una clase ClassA, y tiene ClassB como su atributo:
public ClassA
{
private String attr;
private ClassB classB;
}
public ClassB
{
private String attr1;
private int attr2;
}
De la clase anterior, es posible ordenar la lista de claseA List<ClassA> list
por atributos de ClassB usando Comparator
? Puede ser ordenar por el atributo claseA fácilmente por el código Comparator.comparing(ClassA::getAttr)
, pero lo que si quiero ordenar la lista por el atributo en ClassB
, por no decir el attr2
atributo?
Ravindra Ranwala:
Puede hacerlo como tal,
List<ClassA> sortedList = list.stream()
.sorted(Comparator.comparing(a -> a.getClassB().getAttr2()))
.collect(Collectors.toList());
Pasar la comparación Function
con el Comparator
y se creará una nueva stream
ordenados de acuerdo a lo dado Comparator
. Entonces recogerla en una List
.
Si desea manejar valores nulos, se puede hacer, como a continuación.
final List<ClassA> sortedList = list.stream()
.sorted(Comparator.nullsFirst(
Comparator.comparing(a -> a.getClassB().getAttr1(), Comparator.nullsLast(String::compareTo))))
.collect(Collectors.toList());