48 votes

Existe-t-il un moyen propre (et sans danger pour les valeurs nulles) de multiplier les valeurs d'une carte en Java?

J'ai un Map<String, Double> , et je veux multiplier toutes les valeurs de la carte par 2, par exemple, mais garder les valeurs nulles comme nulles.

Je peux évidemment utiliser une boucle for pour ce faire, mais je me demandais s'il y avait un moyen plus propre de le faire?

 Map<String, Double> someMap = someMapFunction();
Map<String, Double> adjustedMap = new Hashmap<>();
if (someMap != null) {
    for (Map.Entry<String,Double> pair : someMap.entryset()) {
        if (pair.getValue() == null) {
            adjustedMap.put(pair.getKey(), pair.getValue());
        } else {
            adjustedMap.put(pair.getKey(), pair.getValue()*2)
        }

    }
}

Parfois aussi, la carte renvoyée par someMapFunction est une carte immuable, donc cela ne peut pas être fait sur place en utilisant Map.replaceAll . Je ne pouvais pas trouver une solution de flux plus propre.

5voto

Leviand Points 1986

Vous pouvez y parvenir en convertissant en un flux, avec quelque chose comme:

 someMap.entrySet()
        .forEach(entry -> {
            if (entry.getValue() != null) {
                adjustedMap.put(entry.getKey(), someMap.get(entry.getKey()) * 2);
            } else {
                adjustedMap.put(entry.getKey(), null);
            }
        });

qui peut être abrégé en:

 someMap.forEach((key, value) -> {
    if (value != null) {
        adjustedMap.put(key, value * 2);
    } else {
        adjustedMap.put(key, null);
    }
});

Donc, si vous avez une carte avec:

 Map<String, Double> someMap = new HashMap<>();
someMap.put("test1", 1d);
someMap.put("test2", 2d);
someMap.put("test3", 3d);
someMap.put("testNull", null);
someMap.put("test4", 4d);

Vous obtiendrez cette sortie:

 {test4=8.0, test2=4.0, test3=6.0, testNull=null, test1=2.0}

4voto

CodeMatrix Points 1908

Ça peut être fait comme ça

 someMap.entrySet().stream()
            .filter(stringDoubleEntry -> stringDoubleEntry.getValue() != null) //filter null values out
            .forEach(stringDoubleEntry -> stringDoubleEntry.setValue(stringDoubleEntry.getValue() * 2)); //multiply values which are not null

Au cas où vous auriez besoin d'une deuxième carte où seules les valeurs dans lesquelles ne sont pas nulles, utilisez simplement forEach pour les mettre dans votre nouvelle carte.

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