[JAVA] Utilisation pratique de Map que vous ne connaissez pas de manière inattendue

Utilisation de la collection

Il est exagéré de dire qu'il est presque essentiel d'utiliser des collections telles que List, Map et Set lors de la programmation en Java. Parmi eux, Map peut gérer les données au format clé-valeur, il est donc souvent utilisé dans des scènes telles que l'acquisition de données à l'avance, leur emballage dans Map et leur réutilisation.

Surtout à partir de Java8, l'API Stream, l'expression lambda, facultatif, etc. ont été ajoutés pour rendre la collection plus facile à utiliser. Mais saviez-vous qu'il existe en fait de nombreuses méthodes utiles ajoutées derrière ces fonctionnalités supplémentaires? Voici quelques méthodes utiles.

Obtenez la valeur initiale lorsque les données ne peuvent pas être obtenues! (getOrDefaut)

Supposons que vous ayez une carte contenant des points pouvant être utilisés au magasin pour chaque code d'adhésion.

Map<String, Integer> pointMap = new HashMap<>();

Dans le cas d'une logique telle que vouloir retourner 0 point lorsqu'un membre ne détient pas de points, vous pouvez l'obtenir en écrivant comme suit.

int point = 0;

//Obtenez des points si vous détenez des points
if (pointMap.containsKey(code)) {
    point = pointMap.get(code);
}

C'est gênant et pas beau de juger à chaque fois. C'est là qu'intervient getOrDefault.

int point = pointMap.getOrDefault(code, 0);

Vous pouvez l'écrire proprement en une seule ligne. Vous pouvez écrire un code comme celui-ci lorsque vous souhaitez obtenir une valeur si la carte n'a pas de valeur.

Définissez uniquement si vous ne maintenez pas la valeur! (putIfAbsent)

Supposons que vous écriviez une logique pour donner des points uniquement aux membres qui n'ont pas encore de points pour les informations de point.

//Si vous ne détenez pas de points, donnez des points
if (!pointMap.containsKey(code)) {
    pointMap.put(code, point);
}

À partir de Java 8, vous pouvez écrire ceci comme suit:

pointMap.putIfAbsent(code, point);

Dans ce code, le point est défini uniquement lorsqu'il n'y a aucun point associé au membre.

Si la valeur n'est pas conservée, définissez la valeur initiale! (computeIfAbsent)

Supposons que vous ayez une carte qui ajoute et conserve un historique des résultats des tests d'un élève.

Map<String, List<Integer>> scoreMap = new HashMap<>();

S'il y a un étudiant qui a déjà un score, un nouveau score sera ajouté comme historique après ce score.

List<Integer> scores = scoreMap.get(code);

//Si le score de l'élève n'a pas encore été enregistré
if (scores == null) {
    //Créer une liste pour une nouvelle histoire
    scores = new ArrayList<>();
    scoreMap.put(code, scores);
}

scores.add(score);

Si vous ne pouvez pas l'obtenir à partir de la carte, vous devez définir Liste et ajouter des points à cette liste. Vous pouvez écrire ceci en utilisant computeIfAbsent comme suit:

scoreMap.computeIfAbsent(code, k -> new ArrayList<>()).add(score);

Si aucun résultat de test étudiant n'est conservé, une nouvelle liste est créée et s'il y a déjà des résultats, la liste existante est renvoyée. Puisque les points sont ajoutés à la liste retournée tels quels, il sera possible d'écrire sur une ligne.

Manipulez les valeurs lorsqu'elles sont conservées! (computeIfPresent)

Supposons que vous ayez une carte qui contient les jours de présence des étudiants qui ont assisté à un cours, et que le code étudiant des étudiants qui suivent le cours et les jours de présence de 0 sont entrés comme valeurs initiales.

Map<String, Integer> attendanceMap = new HashMap<>();

Si un élève ne suit pas le cours mais vient, il sera ignoré et l'élève qui a suivi le cours augmentera de un le nombre de jours de présence.

if (attendanceMap.containsKey(code)) {
    attendanceMap.put(code, attendanceMap.get(code) + 1) ;
}

Vous pouvez écrire ceci en utilisant computeIfPresent comme suit:

attendanceMap.computeIfPresent(code, (k, v) -> v + 1);

computeIfPresent ne fait rien si le code étudiant n'a pas les jours de présence correspondants, et ne peut augmenter la valeur (jours de présence) que s'il y a l'étudiant correspondant.

Résumé

Java 8 a ajouté de nombreuses fonctionnalités telles que les expressions Stream et lambda, mais en fait, il existe de nombreuses autres fonctionnalités utiles. Il est bon de rechercher sur le net l'API dont vous avez besoin lorsque vous en avez besoin, mais il est également intéressant de lire la documentation officielle de l'API comme vous liriez un dictionnaire.

Recommended Posts

Utilisation pratique de Map que vous ne connaissez pas de manière inattendue
Résumé des mots réservés Java inconnus de manière inattendue
Avez-vous besoin d'une implémentation de Java compatible avec la mémoire?
Utilisation pratique de Map que vous ne connaissez pas de manière inattendue
[Java] La différence entre les méthodes Stream.of () et Arrays.stream () que vous ne connaissez pas de manière inattendue
Connaissez-vous Decorator?
Comment remplacer des caractères que vous ne comprenez pas [Principe]
[Java] N'utilisez pas "+" dans append!
Utilisez-vous Stream en Java?
Comment écrivez-vous dans Scala qui a été écrit en Java? (Liste → Carte)
Comment faire fonctionner @Transactional qui ne fonctionne pas si vous ne l'utilisez pas correctement
[Spring Boot] Si vous utilisez Spring Boot, il était pratique d'utiliser de nombreux utilitaires.
Utilisez-vous l'instruction for après tout? Utilisez-vous l'instruction while? Utilisation correcte des instructions for et while