Trier par plusieurs conditions à l'aide de Java Stream

Récemment, j'ai écrit Java pour la première fois en six mois. J'utilisais ** Java7 (!) ** dans mon entreprise, mais maintenant j'utilise Java8.

J'utilise stream assez souvent, et je l'ai écrit parce que j'ai appris l'autre jour qu'il peut être trié par plusieurs conditions.

Java Stream API Stream (Java Platform SE 8 )

API qui prend en charge les opérations agrégées telles que le traitement itératif et le traitement parallèle.

En combinant avec une expression lambda (fonction de flèche dans JS), il peut être décrit simplement sans utiliser la syntaxe étendue pour.

Trier par plusieurs conditions

Cela est possible en utilisant l'interface Comparator.

Le tri selon plusieurs conditions est possible en spécifiant les conditions de tri avec les méthodes «compare ()» et «thenComparing ()» et en les passant au «sorted ()» du «flux».

Exemple de code

Veuillez me pardonner pour la complexité de la conception.

Classe ʻArticle`

Article.java


import java.time.LocalDate;

public class Article {

  /**Donateur*/
  private String contributor;

  /**Date de publication*/
  private LocalDate date;

  /**Nombre de likes*/
  private int goodCount;

  /**constructeur*/
  public Article(String contributor, LocalDate date, int goodCount) {
    this.contributor = contributor;
    this.date = date;
    this.goodCount = goodCount;
  }

  /** Getter, Setter */
  public String getContributor() {
    return this.contributor;
  }

  public void setContributor(String contributor) {
    this.contributor = contributor;
  }

  public LocalDate getDate() {
    return this.date;
  }

  public void setDate(LocalDate date) {
    this.date = date;
  }

  public int getGoodCount() {
    return this.goodCount;
  }

  public void setGoodCount(int goodCount) {
    this.goodCount = goodCount;
  }

}

Classe Stream

Stream.java


import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;

public class Stream {
  public static void main(String[] args) {
    //Génération de données
    Article a1 = new Article("Taro", LocalDate.of(2018, 7, 11), 15);
    Article a2 = new Article("Taro", LocalDate.of(2015, 11, 1), 53);
    Article a3 = new Article("Taro", LocalDate.of(2015, 10, 31), 54);

    Article a4 = new Article("Hanako", LocalDate.of(2017, 2, 5), 53);
    Article a5 = new Article("Hanako", LocalDate.of(2016, 11, 1), 160);
    Article a6 = new Article("Hanako", LocalDate.of(2012, 8, 20), 22);

    Article a7 = new Article("Pochi", LocalDate.of(2013, 3, 16), 38);
    Article a8 = new Article("Pochi", LocalDate.of(2011, 9, 25), 200);
    Article a9 = new Article("Pochi", LocalDate.of(2018, 4, 13), 10);

    //Création de liste
    List<Article> list = Arrays.asList(a1, a2, a3, a4, a5, a6, a7, a8, a9);
    list.stream().forEach(a ->
      System.out.println(a.getContributor() + " " + a.getDate() + " " + a.getGoodCount()));

  }
}

Pour le moment, si vous affichez une liste de «a1» à «a9»

Résultat de sortie


Taro 2018-07-11 15
Taro 2015-11-01 53
Taro 2015-10-31 54
Hanako 2017-02-05 53
Hanako 2016-11-01 160
Hanako 2012-08-20 22
Pochi 2013-03-16 38
Pochi 2011-09-25 200
Pochi 2018-04-13 10

Sera.

Traitement du tri

sorted (Java Platform SE 8)

Passez Comparator comme argument et triez dans l'ordre spécifié.

Trier par élément unique

Trier par nom dans un dictionnaire.

Stream.java


//Créé par Comparator
Comparator<Article> comparator = Comparator.comparing(Article::getContributor);
//Trier par nom d'affiche
list.stream().sorted(comparator)
  .forEach(a ->
    System.out.println(a.getContributor() + " " + a.getDate() + " " + a.getGoodCount()));

Résultat de sortie


Hanako 2017-02-05 53
Hanako 2016-11-01 160
Hanako 2012-08-20 22
Pochi 2013-03-16 38
Pochi 2011-09-25 200
Pochi 2018-04-13 10
Taro 2018-07-11 15
Taro 2015-11-01 53
Taro 2015-10-31 54

Vous pouvez également trier par d'autres éléments.

thenComparing thenComparing (Java Platform SE 8)

Une méthode qui vous permet d'enchaîner les conditions de comparaison. Utilisez comme suit.

comparator


Comparator.comparing(...).thenComparing(...).thenComparing(...);

Si les conditions précédentes sont identiques («égales»), effectuez une autre comparaison.

Renvoie un comparateur d'ordre lexical avec l'autre comparateur. Si ce comparateur considère que les deux éléments sont égaux (c'est-à-dire compare (a, b) == 0), alors autre est utilisé pour déterminer l'ordre.

Trier par plusieurs éléments

Trier par nom-> date de publication

Stream.java


//Créé par Comparator
Comparator<Article> comparator =
  Comparator.comparing(Article::getContributor).thenComparing(Article::getDate);
//Traitement du tri
list.stream().sorted(comparator)
  .forEach(a ->
    System.out.println(a.getContributor() + " " + a.getDate() + " " + a.getGoodCount()));

Résultat de sortie


Hanako 2012-08-20 22
Hanako 2016-11-01 160
Hanako 2017-02-05 53
Pochi 2011-09-25 200
Pochi 2013-03-16 38
Pochi 2018-04-13 10
Taro 2015-10-31 54
Taro 2015-11-01 53
Taro 2018-07-11 15

Trier par nom-> J'aime

Stream.java


//Créé par Comparator
Comparator<Article> comparator =
  Comparator.comparing(Article::getContributor).thenComparing(Article::getGoodCount);
//Traitement du tri
list.stream().sorted(comparator)
  .forEach(a ->
    System.out.println(a.getContributor() + " " + a.getDate() + " " + a.getGoodCount()));

Résultat de sortie


Hanako 2012-08-20 22
Hanako 2017-02-05 53
Hanako 2016-11-01 160
Pochi 2018-04-13 10
Pochi 2013-03-16 38
Pochi 2011-09-25 200
Taro 2018-07-11 15
Taro 2015-11-01 53
Taro 2015-10-31 54

Si vous voulez dans l'ordre croissant, ajoutez reverse ()

Stream.java


//Créé par Comparator
Comparator<Article> comparator =
  Comparator.comparing(Article::getContributor).thenComparing(Article::getGoodCount).reversed();
//Traitement du tri
list.stream().sorted(comparator)
  .forEach(a ->
    System.out.println(a.getContributor() + " " + a.getDate() + " " + a.getGoodCount()));

Résultat de sortie


Taro 2015-10-31 54
Taro 2015-11-01 53
Taro 2018-07-11 15
Pochi 2011-09-25 200
Pochi 2013-03-16 38
Pochi 2018-04-13 10
Hanako 2016-11-01 160
Hanako 2017-02-05 53
Hanako 2012-08-20 22

Impressions

référence

Stream (Java Platform SE 8 ) Comparator (Java Platform SE 8 )

Recommended Posts

Trier par plusieurs conditions à l'aide de Java Stream
[Java] Trier par plusieurs clés en considérant null
Tri des bulles à l'aide de ArrayList (JAVA)
[Java8] Utilisez stream pour trier les tableaux de type int dans l'ordre décroissant
Spécifiez plusieurs conditions de tri dans Swift
J'ai essayé d'utiliser l'API Java8 Stream
Concaténer les chaînes renvoyées par des méthodes multi-objets dans Java Stream
Essayez d'utiliser l'API Stream en Java
Trier par plusieurs champs dans la classe
[Java] Générez une liste restreinte à partir de plusieurs listes à l'aide de l'API Stream
tri de bulles java
API Java Stream
java sélectionner le tri
Étudier Java 8 (Stream)
Vérification de duplication de flux Java8 (écrire proprement à l'aide de Collector)
java insert tri
Terminaison du flux Java
[Java] Traitement de flux
Java 9 Facultatif :: stream
Etudier java8 (comme lire des fichiers à l'aide de Stream)
[Java] Trier la liste à l'aide de flux et d'expressions lambda
Java: utilisez Stream pour trier le contenu d'une collection
[Java] Développement avec plusieurs fichiers en utilisant package et import
[Java] Remarque sur les collecteurs de flux
[Java] Génération de flux API-Stream
[Java] API / carte de flux
Remplacement multiple de chaîne Java
Tri Java japonais (Kanji)
Pratique de grattage avec Java ②
Pratique de l'API Java8 Stream
À propos de l'opération de réduction du flux Java8
Pratique du grattage avec Java ①
Résumé approximatif du flux Java8
Note n ° 5 "Les valeurs HashMap ont plusieurs valeurs utilisant des classes" [Java]
Utilisation de plusieurs versions de Java avec Brew sur Mac + jEnv