3 votes

Java 8 Streams : Liste vers carte avec valeurs mappées

J'essaie de créer un Map d'un List en utilisant Stream s.

En key doit être le nom de l'élément original,

En value devrait contenir des données dérivées.

Après .map() le flux se compose de Integer et à l'époque de la .collect() Je ne peux pas accéder à "foo" à partir de la page précédente. lambda . Comment obtenir l'article original en .toMap() ?

Peut-on le faire avec Stream ou ai-je besoin de .forEach() ?

(Le code ci-dessous n'est qu'une démonstration, le code réel est bien sûr beaucoup plus complexe et je ne peux pas faire de doSomething() une méthode de Foo ).

import java.util.ArrayList;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class StreamTest {

    public class Foo {
        public String getName() {
            return "FOO";
        }

        public Integer getValue() {
            return 42;
        }
    }

    public Integer doSomething(Foo foo) {
        return foo.getValue() + 23;
    }

    public Map<String, Integer> run() {
        return new ArrayList<Foo>().stream().map(foo -> doSomething(foo)).collect(Collectors.toMap(foo.getName, Function.identity()));
    }

    public static void main(String[] args) {
        StreamTest streamTest = new StreamTest();
        streamTest.run();
    }
}

6voto

Ole V.V. Points 24677

Il me semble que ce n'est pas si compliqué. Ai-je oublié quelque chose ?

    return Stream.of(new Foo())
            .collect(Collectors.toMap(Foo::getName, this::doSomething));

Je suis plutôt adepte des références méthodologiques. Si vous préférez la méthode -> utiliser la notation

    return Stream.of(new Foo())
            .collect(Collectors.toMap(foo -> foo.getName(), foo -> doSomething(foo)));

L'un ou l'autre s'arrêtera (lèvera une exception) s'il y a plus d'un Foo portant le même nom dans votre flux.

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