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. Jetzt something 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);

InformationsquelleAutor Rockoder | 2016-11-11
Schreibe einen Kommentar