2016-11-11 5 views
1

diesen Code Siehe: (Dies funktioniert Code, aber ich weiß nicht wie zwei Linien so zu nutzen suchen, wie kann ich es besser machen)Java 8 Strom - oder Zustand

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); 

ich kann nicht verstehen wie man eine OR (|) Bedingung innerhalb filter verwendet, um zwei spezifische Elemente von List zu entfernen, da es mir Kompilierungszeitfehler geben würde (in IDE) und ich oben zwei filters wie oben benutze. Was könnte ich vermissen?

Dies ist, wie ich versuchte, OR

items = Arrays.stream(items).filter(x -> !x.getName().equalsIgnoreCase("acl1") || 
     x -> !x.getName().equalsIgnoreCase("acl2")).toArray(ItemDetails[]::new); 

=> IntelliJ beschweren (siehe oben) über diese

items = Arrays.stream(items).filter(x -> !x.getName().equalsIgnoreCase("acl1"") || 
     x.getName().equalsIgnoreCase("acl2")).toArray(ItemDetails[]::new); 

Funktioniert nicht zur Laufzeit würde zu verwenden (es filtert nicht)

Gesamter Code mit kommentiertem Code (den ich ausprobiert habe) als 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); 
    } 
+0

Welcher Fehler? Was hast du versucht? Das ist irgendwie wichtig. – Carcigenicate

+0

Ich habe nicht downvote, aber das ist eine schlechte Frage. – Carcigenicate

+0

items = Arrays.stream (Elemente) .filter (x ->! X.getName(). EqualsIgnoreCase ("redirect") || x ->! X.getName(). EqualsIgnoreCase ("Erfolg")). ToArray (ItemDetails [] :: neu); – Rockoder

Antwort

0
items = Arrays.stream(items).filter(
    x -> !x.getName().equalsIgnoreCase("redirect") 
    || x->!x.getName().equalsIgnoreCase("success")) 
    .toArray(ItemDetails[]::new); 

Beachten Sie die zweite x->. Dies wird verwendet, um eine Variable am Anfang eines Lambda zu binden. Das Einfügen in die Mitte ist ungültig und unnötig, da x bereits im Bereich vorhanden ist. Entfernen Sie einfach das bisschen:

items = Arrays.stream(items).filter(x -> 
    !x.getName().equalsIgnoreCase("redirect") 
    || !x.getName().equalsIgnoreCase("success")) 
    .toArray(ItemDetails[]::new); 
+0

Wird diese Antwort testen und aktualisieren. Ich denke, ich habe alle möglichen Permutationen versucht, aber es hat nicht funktioniert. Ich habe viele Varianten ausprobiert und habe schließlich aufgegeben, die Lösung zu verwenden, die ich gepostet habe, da ich zur nächsten Aufgabe wechseln wollte. – Rockoder

+0

Update: meine schlechte, ich vermasselte Syntax. Jetzt ist es in Ordnung. Testen Sie es. – Rockoder

+0

Wenn die Frage gültig ist, bitte upvote Jungs! Es hat mein Abzeichen/Rang – Rockoder

5

Die erste falsch ist, da es eine x -> zu viel hat. Der zweite Filter wird nicht gefiltert, da Sie eine Bedingung erstellt haben, die immer true ist. Verfeinern Sie einfach Ihren Zustand in der filter -Methode und es wird gefiltert.

EDIT (wie die Frage wurde detailliert): Ich denke immer noch, Sie haben einen Fehler in Ihrem Zustand. Wahrscheinlich möchten Sie sowohl acl1 als auch acl2 ausschließen. Wenn dies der Fall ist, sollte Ihr Zustand eher wie folgt aussehen:

!(x.getAclName().equalsIgnoreCase("acl1") || x.getAclName().equalsIgnoreCase("acl2")) 
// or if you prefer && 
!x.getAclName().equalsIgnoreCase("acl1") && !x.getAclName().equalsIgnoreCase("acl2") 
// or if you prefer regular expressions/matches 
!x.getAclName().matches("(?i)^acl[1|2]$") 
+0

Danke! Das funktioniert perfekt. Kann jemand meine Frage auffrischen, wenn das anderen helfen kann! Nicht sicher, warum es -1 ist, wenn es gültige Kommentare von Leuten anzieht. – Rockoder

0

Sie sollten mehrere Prädikate für jede Bedingung erstellen und sie mit oder verbinden. Ich habe mein folgendes Beispiel hinzugefügt:

public class MeTest { 

    Predicate<Integer> con1 = i -> i==0; 
    Predicate<Integer> con2 = i -> i==1; 
    Predicate<Integer> con3 = i -> i==2; 

    @Test 
    public void testOr() { 
     List<Integer> asdas = IntStream.range(1, 10).boxed().filter(con1.or(con2).or(con3)).collect(toList()); 
     System.out.println("asdas = " + asdas); 
    } 
}