Recherche de la valeur la plus élevée dans une carte Java

Recherche de la valeur la plus élevée dans une carte Java

1. Vue d'ensemble

Dans ce tutoriel rapide,we’ll explore various ways to find the maximum value in a Java Map. Nous verrons également comment les nouvelles fonctionnalités deJava 8 ont simplifié cette opération.

Avant de commencer, récapitulons brièvement commentobjects are compared en Java.

En général, les objets peuvent exprimer un ordre naturel en implémentant la méthodecompareTo() à partir de l'interfaceComparable. Cependant, un ordre autre que l'ordre naturel peut être utilisé via un objetComparator. Nous les verrons plus en détail au fur et à mesure.

2. Avant Java 8

Commençons par explorer comment trouver la valeur la plus élevée sans les fonctionnalités de Java 8.

2.1. Utiliser une itération simple

En utilisant l'itération, nous pourrions simplement parcourir toutes les entrées de aMap pour choisir la valeur la plus élevée, en stockant la plus élevée actuelle dans une variable:

public > V maxUsingIteration(Map map) {
    Map.Entry maxEntry = null;
    for (Map.Entry entry : map.entrySet()) {
        if (maxEntry == null || entry.getValue()
            .compareTo(maxEntry.getValue()) > 0) {
            maxEntry = entry;
        }
    }
    return maxEntry.getValue();
}

Ici, nous utilisons également des génériques Java pour créer une méthode qui peut être appliquée à différents types.

2.2. Utilisation deCollections.max()

Voyons maintenant comment la méthode utilitairemax() de la classeCollections peut nous éviter d'écrire beaucoup de ceci nous-mêmes:

public > V maxUsingCollectionsMax(Map map) {
    Entry maxEntry = Collections.max(map.entrySet(), new Comparator>() {
        public int compare(Entry e1, Entry e2) {
            return e1.getValue()
                .compareTo(e2.getValue());
        }
    });
    return maxEntry.getValue();
}

Dans cet exemple,we’re passing a Comparator object to max() qui peut tirer parti de l'ordre naturel des valeursEntry viacompareTo() ou implémenter un ordre complètement différent.

3. Après Java 8

Les fonctionnalités de Java 8 peuvent simplifier notre tentative ci-dessus d'obtenir la valeur maximale d'unMap de plusieurs manières.

3.1. Utilisation deCollections.max() avec une expression Lambda

Commençons par explorer comment les expressions lambda peuvent simplifier l'appel àCollections.max():

public > V maxUsingCollectionsMaxAndLambda(Map map) {
    Entry maxEntry = Collections.max(map.entrySet(), (Entry e1, Entry e2) -> e1.getValue()
        .compareTo(e2.getValue()));
    return maxEntry.getValue();
}

Comme nous pouvons le voir ici,lambda expressions save us from defining the full-fledged functional interface et fournissent une manière concise de définir la logique. Pour en savoir plus sur les expressions lambda, consultez égalementour previous article.

3.2. Utilisation deStream

L'APIStream est un autre ajout àJava 8 qui a largement simplifié le travail avec les collections:

public > V maxUsingStreamAndLambda(Map map) {
    Optional> maxEntry = map.entrySet()
        .stream()
        .max((Entry e1, Entry e2) -> e1.getValue()
            .compareTo(e2.getValue())
        );

    return maxEntry.get().getValue();
}

Cette API propose de nombreuses requêtes de traitement de données comme les transformationsmap-reduce sur les collections. Here, we’ve used max() over a stream of Map Entry qui est un cas particulier d'une opération de réduction. Plus de détails sur l'APIStream sont disponibleshere.

Nous utilisons également ici l'APIOptional qui est un objet conteneur ajouté dans Java 8 qui peut ou non contenir une valeur non nulle. Plus de détails surOptional peuvent être obtenushere.

3.3. Utilisation deStream avec référence de méthode

Enfin, voyons comment les références de méthode peuvent simplifier davantage notre utilisation des expressions lambda:

public > V maxUsingStreamAndMethodReference(Map map) {
    Optional> maxEntry = map.entrySet()
        .stream()
        .max(Comparator.comparing(Map.Entry::getValue));
    return maxEntry.get()
        .getValue();
}

Dans les cas où les expressions lambda appellent simplement une méthode existante, une référence de méthode nous permet de le faire en utilisant directement le nom de la méthode. Pour plus de détails sur method references, jetez un œil àthis previous article.

4. Conclusion

Dans cet article, nous avons vu plusieurs façons de trouver la valeur la plus élevée dans unJava Map, dont certaines utilisaient des fonctionnalités ajoutées dans le cadre de Java 8.

Comme toujours, le code des exemples est disponibleover on GitHub.