Bonjour,

j'ai plusieurs centaines de données dans un fichier sous la forme:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
"code_barre,quantité"

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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
clé : val3	val : 9
clé : val2	val : 2
clé : val1	val : 35
et devrait être

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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