6 votes

Java 8 sort sur la propriété d'un membre de classe

Déclaration de classe :

class Entity {
    String name;
    SubEntity subEntity; // subEntity has a method getAmount() which returns int
}

J'ai compris qu'avec Java 8, on peut trier comme :

entities.sort(Comparator.comparing(Entity::name));

Mais existe-t-il un moyen de le trier sur les propriétés des sous-entités, par exemple :

entities.sort(Comparator.comparing(Entity::SubEntity::getAmount()));

P.S. : Tout le monde est d'accord pour les blagues.

8voto

Jon Skeet Points 692016

Pas en utilisant une référence de méthode, non - mais il est facile de le faire avec une lambda à la place :

entities.sort(Comparator.comparing(entity -> entity.getSubEntity().getAmount()));

Fondamentalement, il n'y a rien de magique dans Comparator.comparing - il accepte simplement un Function<? super T,? extends U> keyExtractor Vous devez donc trouver un moyen de créer une telle fonction. Une référence de méthode est un moyen pratique de créer une fonction, mais une expression lambda est plus flexible.

5voto

Eugene Points 6271

Vous pouvez le faire par le biais d'un lambda, par opposition à une référence de méthode :

 entities.sort(Comparator.comparing(x -> x.getSubEntity().getAmount())

Si vous avez effectivement un int comme vous le dites dans vos commentaires, alors utilisez :

 Comparator.comparingInt(...)

5voto

Andrew Tobilko Points 1283

Les gars vous ont donné de bonnes réponses. Ce n'est pas censé être une amélioration de leurs réponses. Je veux juste fournir une idée alternative.

entities.sort(Comparator.comparing(((Function<Entity, SubEntity>)Entity::getSubEntity).andThen(SubEntity::getAmount)));

J'ai formé un extracteur de clés en combinant deux fonctions Entity::getSubEntity y SubEntity::getAmount avec Function#andThen . Les deux ont été rédigés comme des références de méthode. Le cast est nécessaire pour déterminer le type d'une instance et appeler andThen sur cette instance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X