Java 8 stream API: Ausnahmen beim ändern von Listen

Nehmen wir ein ArrayList und füllen Sie es mit etwas einfachem:

List<String> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
    list.add(""+i);
}

Werde ich versuchen, Sie zu entfernen ein Mitglied, sagen wir namens 5, mit verschiedenen Möglichkeiten der stream-API. Für diese definiere ich die Methode, die mir eine ConcurentModificationException bei der Verwendung von traditionellen iteration mit iterator.

void removeMember(String clientListener) {
    list.remove(clientListener);
}

Dieser code gibt mir die Ausnahme, die ich verstehen:

list.parallelStream()
    .filter(string -> string.equalsIgnoreCase("5"))
    .forEach(string -> removeMember(string));

Allerdings versucht nur stream(), nicht parallelStream() gibt einen null-Zeiger-Ausnahme (NPE), die ist seltsam für mich:

list.stream()
    .filter(string -> string.equalsIgnoreCase("5"))
    .forEach(string -> removeMember(string));

Ändern Sie nun den List Typ LinkedList<>. Letzte code mit stream() gibt mir ein ConcurentModificationException, und parallelStream() plötzlich funktioniert!

So, die Fragen stellen.

  1. Ist die interne parallelStream() Küche (Spliterators und anderer Magie) smart genug, um solche element entfernen für LinkedList? Wird es immer?

  2. Warum war das NPE für ArrayList? Warum NPE, nicht ConcurentModificationException ich meine.

  • Durch die Art und Weise, Sie könnte verwenden Integer.toString(i) statt ""+i
  • 4-mal länger((
  • Ich wäre nicht überrascht, wenn Sie könnte erheblich zur Verbesserung der Geschwindigkeit als Ergebnis.
  • Wenn Sie möchten, entfernen von Elementen aus einer Liste, entspricht ein Prädikat, verwenden Sie List.removeIf.
InformationsquelleAutor rapucha | 2015-06-02
Schreibe einen Kommentar