Java 8 Streams - oder-Bedingung
Finden Sie diesen code:
(Dies funktioniert code, aber ich weiß nicht, wie für die Verwendung von 2 Zeilen, so suchen, wie kann ich es besser machen)
ItemDetails[] items = response.getDetailsList();
items = Arrays.stream(items).filter(x -> !x.getName().equalsIgnoreCase("acl1")).toArray(ItemDetails[]::new);
items = Arrays.stream(items).filter(x -> !x.getName().equalsIgnoreCase("acl2")).toArray(ItemDetails[]::new);
Konnte ich nicht herausfinden, wie man verwenden Sie eine OR (|)
Zustand innerhalb filter
zu entfernen, die zwei bestimmte Elemente aus List
da es mir geben würde, compile-Zeit-Fehler (in der IDE) und ich am Ende mit zwei filters
wie oben.
Was könnte ich vermissen?
Dies ist, wie ich versucht zu verwenden ODER
items = Arrays.stream(items).filter(x -> !x.getName().equalsIgnoreCase("acl1") ||
x -> !x.getName().equalsIgnoreCase("acl2")).toArray(ItemDetails[]::new);
=> IntelliJ würde beschweren sich über diese (oben)
items = Arrays.stream(items).filter(x -> !x.getName().equalsIgnoreCase("acl1"") ||
x.getName().equalsIgnoreCase("acl2")).toArray(ItemDetails[]::new);
Funktioniert nicht zur Laufzeit (keine filter)
Gesamten code mit code auskommentiert (die ich ausprobiert habe) Referenz
public static void mapTest () {
AclDetailItem[] items = new AclDetailItem[3];
AclDetailItem item1 = new AclDetailItem();
item1.setAclName("acl1");
AclDetailItem item2 = new AclDetailItem();
item2.setAclName("acl2");
AclDetailItem item3 = new AclDetailItem();
item3.setAclName("acl3");
items[0] = item1;
items[1] = item2;
items[2] = item3;
System.out.println ("Before " + items.length);
items = Arrays.stream(items).filter(x -> !x.getAclName().equalsIgnoreCase("acl1")).toArray(ItemDetails[]::new);
items = Arrays.stream(items).filter(x -> !x.getAclName().equalsIgnoreCase("acl2")).toArray(ItemDetails[]::new);
System.out.println ("After " + items.length);
}
- Was für Fehler? Was haben Sie versucht? Das ist irgendwie wichtig.
- Ich habe nicht downvote, aber dies ist eine schlechte Frage.
- items = Arrays.stream(items).filter(x -> !x.getName().equalsIgnoreCase("redirect") || x->!x.getName().equalsIgnoreCase("success")).toArray(ItemDetails[]::new);
- Bedingte oder ist
||
vielleicht ist das Ihr Problem? - Bitte Bearbeiten Sie diese in der ursprünglichen Frage.
- Entfernen Sie Ihre zweite
x->
... - Von diesen beiden, welches ist das richtige? items = Arrays.stream(items).filter(x -> !x.getName().equalsIgnoreCase(aclGuestRedirect) || x -> !x.getName().equalsIgnoreCase(aclGuestRedirect)).toArray(AclDetailsItem[]::new); items = Arrays.stream(items).filter(x -> !x.getName().equalsIgnoreCase(aclGuestRedirect) || x.getName().equalsIgnoreCase(aclGuestRedirect)).toArray(AclDetailsItem[]::new);
- Welches, denkst du, ist das so richtig? Sie haben einen lambda-Ausdruck als
x -> something
. Jetztsomething
muss einen booleschen Wert zurückzugeben hier. So!x.getName().equalsIgnoreCase("redirect")
gibt einen booleschen Wert zurück, alles gut. Und dann!x.getName().equalsIgnoreCase("redirect") || !x.getName().equalsIgnoreCase("success")
auch nicht... - Dies ist ein Fehler, zu verstehen, dass die nachträgliche Anwendung der Filter ist äquivalent zu UND - Kombination anstelle der ODER, aber erfolgreich zeigen jedem Leser in die falsche Richtung mit ausdrücklich aufgefordert, für eine ODER-Kombination. Sie nicht sogar brauchen, kombinieren Sie die Filter, wenn Sie nur wollen, ist ein einzelnes Stream-op:
ItemDetails[] items = Arrays.stream(response.getDetailsList()) .filter(x -> !x.getName().equalsIgnoreCase("acl1")) .filter(x -> !x.getName().equalsIgnoreCase("acl2")) .toArray(ItemDetails[]::new);
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie mehrere Prädikate, die für jede Kondition und tun Sie es mit oder. Ich habe mein Beispiel unten:
Das erste ist falsch, denn er hat eine
x ->
zu viel.Die zweite nicht-filter, wie Sie konstruiert einen Zustand, der immer
true
. Nur verfeinern Sie Ihre Bedingung in derfilter
-Methode und der filter.BEARBEITEN (die Frage bekam detailliert):
Ich denke immer noch, Sie haben einen Fehler in Ihrem Zustand. Sie wahrscheinlich wollen, schließen Sie beide
acl1
undacl2
. Wenn dem so ist, Ihr Zustand sollte eher so Aussehen:Hinweis: die zweite
x->
. Zum binden einer Variablen an den Anfang einer lambda. Indem es in der Mitte ist ungültig und überflüssig, dax
bereits in dem Umfang besteht. Entfernen Sie einfach das bit:aclGuestRedirect
oder"redirect"
?