Ich bin oft in der Notwendigkeit, eine Stream
zu filtern oder ein Prädikat zu verwenden, das überprüft, ob ein bestimmtes Feld einen bestimmten Wert hat.Gibt es eine Bequemlichkeitsmethode, um ein Prädikat zu erstellen, das prüft, ob ein Feld einem gegebenen Wert entspricht?
Sprich zum Beispiel habe ich diese POJO:
public class A {
private Integer field;
public A(final Integer field) {
this.field = field;
}
public Integer getField() {
return field;
}
}
Und ich mag ein Stream
von Objekten filtern, basierend auf dem Wert der field
:
final Integer someValue = 42;
Stream.of(new A(42), new A(1729), new A(42), new A(87539319), new A(null))
.filter(a -> Objects.equals(a.getField(), someValue))
...
Gäbe es eine bequeme Methode sein, das Prädikat für die filter
Methode generieren? Ich habe bemerkt, dass es Predicate.isEqual
gibt, aber es passt nicht zur Notwendigkeit.
Ich konnte ganz schreiben leicht ein wie folgt aus:
public static <T,R> Predicate<T> isEqual(Function<? super T, ? extends R> f, R value) {
return v -> Objects.equals(value, f.apply(v));
}
und verwenden Sie es als:
Stream.of(new A(42), new A(1729), new A(42), new A(87539319), new A(null))
.filter(isEqual(A::getField, someValue))
...
aber ich würde es vorziehen, eine bestehende Methode aus dem JDK wenn möglich wiederzuverwenden.
Nicht, dass ich weiß. Wenn Sie jedoch wissen, dass 'someValue' nicht' null' ist, genügt ein einfaches 'a -> someValue.equals (a.getField())'. Es sieht für mich nicht schlechter aus als 'isEqual (A :: getField, someValue)', besonders wenn ich bedenke, dass 'A' eher eine' NameOfARealLifeClass' ist ... – Holger