Vergewissern Sie sich, dass es sich nicht um Codegeruch handelt. Ist es möglich, die Logik umzukehren und "inklusiv" statt "exklusiv" zu sein?
List<String> names = ....
List<String> reducedNames = ....
for (String name : names) {
// Do something
if (conditionToIncludeMet)
reducedNames.add(name);
}
return reducedNames;
Die Situation, die mich zu dieser Seite geführt hat, betraf einen alten Code, der eine Liste in einer Schleife durchlief und Unbestimmtheiten verwendete, um Elemente aus der Liste zu entfernen. Ich wollte den Code so umgestalten, dass er den foreach-Stil verwendet.
Es durchlief eine ganze Liste von Elementen, um zu überprüfen, auf welche der Benutzer Zugriffsrechte hatte, und entfernte diejenigen aus der Liste, für die er keine Rechte hatte.
List<Service> services = ...
for (int i=0; i<services.size(); i++) {
if (!isServicePermitted(user, services.get(i)))
services.remove(i);
}
Um dies rückgängig zu machen und das Entfernen nicht zu verwenden:
List<Service> services = ...
List<Service> permittedServices = ...
for (Service service:services) {
if (isServicePermitted(user, service))
permittedServices.add(service);
}
return permittedServices;
Wann wäre "entfernen" vorzuziehen? Eine Überlegung ist, wenn gien eine große Liste oder teure "add", kombiniert mit nur ein paar entfernt im Vergleich zu der Liste Größe. Es könnte effizienter sein, nur einige wenige Löschungen vorzunehmen als viele Hinzufügungen. Aber in meinem Fall war eine solche Optimierung nicht angebracht.
34 Stimmen
Kein guter Plan. Nur weil die Sprache es bei einem bestimmten Lauf toleriert, ist es noch lange keine gute Idee.
0 Stimmen
Sie müssen mich in einer schlechten Stimmung erwischt haben, aber mir scheint, die Antwort auf diese Frage kommt direkt aus der foreach-Dokumentation.
2 Stimmen
stackoverflow.com/questions/223918/
1 Stimmen
Als Alternative könnten Sie in Erwägung ziehen, Ihre Sammlung nicht direkt zu ändern, sondern einen Filter-Kombinator wie Guavas Iterables#filter zu verwenden: code.google.com/p/guava-libraries/wiki/FunctionalExplained Achten Sie auf sein träges Verhalten!
0 Stimmen
Wollten Sie wirklich fragen, ob Sie
Collection
speziell, anstattList
die Sie in Ihrem Code verwenden? Wenn Sie beabsichtigen, nach folgenden Punkten zu fragenList
und nichtCollection
dann bearbeiten Sie diese Frage bitte entsprechend - dann wäre diese Frage kein Duplikat! (Ein großer Unterschied vonList
gegenCollection
ist dasList
enthältget
in seiner Schnittstelle, währendCollection
nicht).0 Stimmen
Sie können die removeIf-Methode verwenden. Beispiel: sockets.removeIf(Socket::isClosed);