Je veux pouvoir convertir un List
en HashMap
où la clé est le elementName
et les valeurs est une liste de quelque chose de aléatoire (dans ce cas, c'est le nom de l'élément ). Donc en bref je veux (A->List(A), B->List(B), C-> List(C)
). J'ai essayé d'utiliser toMap()
et de lui passer les keyMapper
et ValueMapper
mais j'obtiens une erreur de compilation. J'apprécierais vraiment que quelqu'un puisse m'aider.
Merci!
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> list = Arrays.asList("A","B","C","D");
Map<String, List<String>> map = list.stream().map((element)->{
Map<String, List<String>> map = new HashMap<>();
map.put(element, Arrays.asList(element));
return map;
}).collect(??);
}
Function<Map<String, String>, String> key = (map) -> {
return map.keySet().stream().findFirst().get();
};
Function<Map<String, String>, String> value = (map) -> {
return map.values().stream().findFirst().get();
};
=== Cela a fonctionné pour moi
Merci pour votre aide, vous tous! @izstas "ils devraient opérer sur les éléments" ont beaucoup aidé :). En fait, c'est ce que je cherchais pour être exact
public static void test2 (){
Function<Entry<String, List<String>>, String> key = (entry) -> {
return entry.getKey();
};
Function<Entry<String, List<String>>, List<String>> value = (entry) -> {
return new ArrayList<String>(entry.getValue());
};
BinaryOperator<List<String>> merge = (old, latest)->{
old.addAll(latest);
return old;
};
Map<String, List<String>> map1 = new HashMap<>();
map1.put("A", Arrays.asList("A1", "A2"));
map1.put("B", Arrays.asList("B1"));
map1.put("D", Arrays.asList("D1"));
Map<String, List<String>> map2 = new HashMap<>();
map2.put("C", Arrays.asList("C1","C2"));
map2.put("D", Arrays.asList("D2"));
Stream<Map<String, List<String>>> stream =Stream.of(map1, map2);
System.out.println(stream.flatMap((map)->{
return map.entrySet().stream();
}).collect(Collectors.toMap(key, value, merge)));
}
Les fonctions key
et value
que vous avez définies dans votre code ne sont pas correctes car elles doivent opérer sur les éléments de votre liste, et vos éléments ne sont pas Map
s.
Le code suivant fonctionne pour moi:
List<String> list = Arrays.asList("A", "B", "C", "D");
Map<String, List<String>> map = list.stream()
.collect(Collectors.toMap(Function.identity(), Arrays::asList));
Premier argument à Collectors.toMap
définit comment créer une clé à partir de l'élément de liste (en le laissant tel quel), le deuxième argument définit comment créer une valeur (créer un ArrayList
avec un seul élément).
Vous pouvez utiliser la méthode groupingBy
pour gérer l'agrégation, par exemple:
public static void main(String[] args) {
List<String> list = Arrays.asList("A", "B", "C", "D", "A");
Map<String, List<String>> map = list.stream().collect(groupingBy(Function.identity()));
}
Si vous voulez plus de flexibilité (par exemple pour mapper la valeur et renvoyer un ensemble au lieu d'une liste), vous pouvez toujours utiliser la méthode groupingBy
avec plus de paramètres comme spécifié dans javadoc:
Map<City, Set<String>> namesByCity = people.stream().collect(groupingBy(Person::getCity, mapping(Person::getLastName, toSet())));
Merci pour votre aide, vous tous! @izstas "ils devraient opérer sur les éléments" ont beaucoup aidé :). En fait, c'est ce que je cherchais pour être exact
public static void test2 (){
Function<Entry<String, List<String>>, String> key = (entry) -> {
return entry.getKey();
};
Function<Entry<String, List<String>>, List<String>> value = (entry) -> {
return new ArrayList<String>(entry.getValue());
};
BinaryOperator<List<String>> merge = (old, latest)->{
old.addAll(latest);
return old;
};
Map<String, List<String>> map1 = new HashMap<>();
map1.put("A", Arrays.asList("A1", "A2"));
map1.put("B", Arrays.asList("B1"));
map1.put("D", Arrays.asList("D1"));
Map<String, List<String>> map2 = new HashMap<>();
map2.put("C", Arrays.asList("C1","C2"));
map2.put("D", Arrays.asList("D2"));
Stream<Map<String, List<String>>> stream =Stream.of(map1, map2);
System.out.println(stream.flatMap((map)->{
return map.entrySet().stream();
}).collect(Collectors.toMap(key, value, merge)));
}