web-dev-qa-db-fra.com

collecte de HashMap <String, List <String>> Java 8

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)));
}
26
user3869813

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 Maps.

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).

19
izstas

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())));
44
Phoenix

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)));
}
6
user3869813