webentwicklung-frage-antwort-db.com.de

Wie konvertiere ich Liste mit Indizes mithilfe von Stream - Java 8?

Ich habe eine Methode erstellt, bei der jedes Zeichen des Alphabets numeriert wird. Ich lerne Streams (funktionale Programmierung) und versuche, sie so oft wie möglich zu verwenden, aber ich weiß nicht, wie ich das tun soll:

private Map<Character, Integer> numerateAlphabet(List<Character> alphabet) {
    Map<Character, Integer> m = new HashMap<>();
    for (int i = 0; i < alphabet.size(); i++)
        m.put(alphabet.get(i), i);
    return m;
}

Wie kann man es also mit Streams von Java 8 umschreiben?

16
Letfar

Vermeiden Sie Stateful-Indexzähler wie die auf anderen Variablen basierenden Lösungen, die auf AtomicInteger basieren. Sie werden fehlschlagen, wenn der Stream parallel war. Streamen Sie stattdessen über Indizes:

IntStream.range(0, alphabet.size())
         .boxed()
         .collect(toMap(alphabet::get, i -> i));

Oben wird davon ausgegangen, dass die eingehende Liste keine doppelten Zeichen enthalten sollte, da es sich um ein Alphabet handelt. Wenn Sie die Möglichkeit haben, Elemente zu duplizieren, werden mehrere Elemente demselben Schlüssel zugeordnet, und Sie müssen die merge-Funktion angeben. Beispielsweise können Sie (a,b) -> b oder (a,b) ->a als dritten Parameter der toMap-Methode verwenden.

35
Misha

Es ist besser, Function.identity() anstelle von i->i zu verwenden:

IntStream.range(0, alphabet.size())
                .boxed()
                .collect(toMap(alphabet::get, Function.identity()));
11
i_am_zero

Verwenden von Streams mit AtomicInteger in Java 8:

private Map<Character, Integer> numerateAlphabet(List<Character> alphabet) {
    AtomicInteger index = new AtomicInteger();
    return alphabet.stream().collect(
            Collectors.toMap(s -> s, s -> index.getAndIncrement(), (oldV, newV)->newV));
}
6
ashiquzzaman33

mit AtomicInteger

    AtomicInteger counter = new AtomicInteger();
    Map<Character, Integer> map = characters.stream()
            .collect(Collectors.toMap((c) -> c, (c) -> counter.incrementAndGet()));
    System.out.println(map);
1
Saravana