Ich habe eine unerwartete Situation in einem Projekt, in dem alle Typen, die eine Klasse erweitern, in eine Java-Sammlung gepackt werden. Aber nur eine bestimmte Erweiterung dieser Klasse enthält eine zusätzliche Methode. Nennen wir es "also ()"; und lassen Sie mich klar sein, dass keine andere Erweiterung es hat. Kurz bevor ich eine Aufgabe für jedes Element in dieser Sammlung ausführe, muss ich auch () für jedes Element aufrufen, das es implementiert.
Der einfachste Weg ist folgender:
stuff.stream().filter(item -> item instanceof SpecificItem)
.forEach(item -> ((SpecificItem)item).also()));
stuff.stream().forEach(item -> item.method());
Es funktioniert gut, aber ich bin mit der "Instanz von" dort nicht zufrieden. Das ist im Allgemeinen ein Hinweis auf schlechten Codegeruch. Es ist sehr wahrscheinlich, dass ich diese Klasse umgestalten werde, nur um sie loszuwerden. Bevor ich jedoch etwas so Dramatisches mache, dachte ich, ich würde mich bei der Community erkundigen, ob jemand mit mehr Erfahrung mit Streams oder Sammlungen eine einfachere Lösung hat.
Ist es als Beispiel (sicherlich nicht exklusiv) möglich, eine Ansicht einer Sammlung zu erhalten, die Einträge nach Klassen filtert?
.getKind()
oder .isSpecific()
?
SpecificItem
Implementierung dann nicht erst also()
zuerst aufgerufen wird?
Iterable
hat keine stream()
Methode, aber Sie können forEach()
direkt auf eine aufrufen Iterable
.
SpecificItem
müssen und dies der richtige Weg ist, um das Prädikat anzugeben, warum sind Sie dann zimperlich,instanceof
wenn Sie dort sind?