problème collector sur mesure
Bonjour,
j'ai plusieurs centaines de données dans un fichier sous la forme:
Dans le fichier, il y a plusieurs lignes avec une chaîne comprenant le même "code_barre" et des "quantité" différentes. Mon but de de regrouper l'ensemble dans une Map<String,Integer> où la clé est le "code_barre" unique et la valeur est la somme des quantités trouvées.
Pour ce faire, j'ai pensé faire le boulot via un Collector du type:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
public class MonCollectorData implements Collector<String, Map<String,Integer>, Map<String,Integer>> {
@Override
public BiConsumer<Map<String,Integer>, String> accumulator() {
return (map,st) ->{
String[] tempo = st.split(",");
String cle = tempo[0].trim();
Integer val = null ;
try {
val = Integer.valueOf(tempo[1].trim());
}
catch(NumberFormatException e) {
val = Integer.valueOf("0");
}
map.put(cle, val);
};
}
@Override
public Set<Characteristics> characteristics() {
return EnumSet.of(Characteristics.UNORDERED);
}
@Override
public BinaryOperator<Map<String,Integer>> combiner() {
return (map1, map2)-> {
map1.forEach((k, v) -> map2.merge(k, v, Integer::sum));
return map2;
};
}
@Override
public Function<Map<String,Integer>, Map<String,Integer>> finisher() {
return Function.identity();
}
@Override
public Supplier<Map<String,Integer>> supplier() {
return HashMap::new;
}
} |
Cependant, un faisant des tests comme ci-dessous, je n'obtiens le résultat espéré (idem avec les données du fichier où le Stream<String> est créé cette fois-ci par la lecture des données):
Code:
1 2 3 4 5 6
|
String[] tab = {"val1,41","val2,9","val3,5","val3,9","val2,2","val1,35"};
resMap = Arrays.stream(tab).collect(new MonCollectorData());
resMap.forEach((k,v) -> System.out.println("clé : "+k+"\t"+"val : "+v)); |
Le résultat est:
Code:
1 2 3 4
|
clé : val3 val : 9
clé : val2 val : 2
clé : val1 val : 35 |
et devrait être
Code:
1 2 3 4
|
clé : val3 val : 14
clé : val2 val : 11
clé : val1 val : 76 |
Après une journée de lecture, relecture du code, test, et débogage , je ne trouve pas l'erreur: pour quoi la somme ne se fait pas au niveau de la fusion des Map ?
merci pour votre aide