2015-07-16 55 views
6

Ich habe folgende verschachtelte For-Schleifen, die ich in deklarativen Code konvertieren muss.Umwandlung von verschachtelten Schleifen in Java 8 Streams

for (String variable : variables){ 
     boolean validAttribute = false; 
     if(variable.equals(SOME_CONSTANT)){ 
      validAttribute = true; 
     } 
     else { 
     for(String attrName: attrNames){ 
      if(variableName.equals(attrName)){ 
       validAttribute = true; 
       break; 
      } 
     } 
     } 
     if(!validAttribute){ 
      return false; 
     } 
} 

Ich bin in der Lage es etwas zu erreichen, wie die flatMap verwenden. Aber scheint nicht effizient, da die frühere for-Schleife verwendet, um bei dem ersten nicht übereinstimmenden Eintrag zu brechen. Gibt es einen anderen einfacheren Weg?

(auch unter dem Code scheint zu verstehen, schwer)

List<String> inValidVariables = attrNames.stream().flatMap(attrName -> variableNames.stream() 
          .filter(variableName -> !variableName.equals(attrName) && !variableName.equals(SOME_CONSTANT))) 
          .collect(Collectors.toList()); 
return inValidVariables.size() ==0; 

Antwort

5

Persönlich würde ich dieses Problem lösen, wie die

variables.stream().allMatch((item) -> item.equals(SOME_CONSTANT) 
           || attrNames.contains(item)); 

ich Ströme denken sollte Ihre Aufgabe zu erleichtern nicht komplizierter, das ist der Grund, warum ich es nicht für innere Schleife verwendet habe, wie Sie dies umgestalten können.

hier ist link ideone wo Sie beide Methoden ausführen können

+0

Ich mag Ihre Antwort noch mehr (ich dachte zu kompliziert) – griFlo

+0

Und ich benutze die Streams API nicht so lange. Aber würde nicht ein paralleler Strom es (viel?) Schneller machen? – griFlo

+0

@griFlo Ich weiß nicht, ich fing gestern an, java8 zu sehen :) – user902383

2

ich denke, das Ihre Anforderung entsprechen sollte:

variables.stream().noneMatch(variable-> !variable.equals(CONSTANT)&&attrNames.stream().noneMatch(attrName -> variable.equals(attrName))); 

kehrt true, wenn die jede Variable die Konstante oder eine der ist gleich attrNames.

sonst kehrt false (wenn ther eine Variable ist, die die CONSTANT oder jede attrName passen tut)

+0

Können Sie nicht 'Variable tun -> stuff' statt' Variable -> {return Zeug;} '? –

+0

@tobias_k ja du kannst. Ich habe meine Antwort bearbeitet – griFlo