Ich habe mehrere Funktionen, um eine Karte von Objekten anhand von Kriterien zu filtern.Stream und Lambdas als Parameter
Funktionen haben den gleichen Körper, nur die boolesche Passbedingung ändert sich.
filterOnFirstCriteria(Criteria criterias, Map<Integer, List<Container>> containerMap, Map<Integer, ClassKey> classKeys) {
for (Map.Entry<Integer, List<Container>> entry : containerMap.entrySet()) {
List<Container> containers = entry.getValue();
ClassKey classKey = classKeys.get(entry.getKey());
for (Container container : containers) {
List<MyObject> found = new ArrayList<>();
for (MyObject myObject : container.getMyObjects()) {
boolean pass = criterias.getListOfFilter().stream().filter(s -> s.equals(container.getReference())).count() > 0;
if (pass) {
found.add(myObject);
}
}
container.getMyObjects().removeAll(found);
}
}
}
filterOnOtherCriteria(Criteria criterias, Map<Integer, List<Container>> containerMap, Map<Integer, ClassKey> classKeys) {
for (Map.Entry<Integer, List<Container>> entry : containerMap.entrySet()) {
List<Container> containers = entry.getValue();
ClassKey classKey = classKeys.get(entry.getKey());
for (Container container : containers) {
List<MyObject> found = new ArrayList<>();
for (MyObject myObject : container.getMyObjects()) {
boolean pass = myObject.getListOfObject().stream().filter(obj -> criterias.getLocations().stream().anyMatch(location -> location.equals(obj.getLocation()))).count() > 0;
if (pass) {
found.add(myObject);
}
}
container.getMyObjects().removeAll(found);
}
}
}
Bedingungen können auf alle Objekte von oberen Schleifen sein. Ich möchte den duplizierten Schleifencode in eine Funktion extrahieren, aber ich weiß nicht, wie ich eine Art Callback für die boolesche Bedingung übergeben soll.
Vielen Dank.
Pass ein zusätzliches Prädikats, wo Kontext all notwendigen Informationen für das Prädikat zurückgeben wahr oder falsch (dh myObject, Container, Kriterien sollten, zu entscheiden, enthalten würde s). –