2017-02-13 3 views
0

hierarchischen Pfad Stellen in geordneten Liste gespeichert und die Validierungfunktionaler Stil Validierungsalgorithmus

List<String> path = Lists.newArrayList("path","to","end"); 

Iterator<String> iterator = path.iterator(); 

while (iterator.hasNext()) { 
    if (iterator.next() == null) { 
     while (iterator.hasNext()) { 
      if (iterator.next() != null) { 
       throw new Exception("Invalid path"); 
      } 
     } 
    } 
} 

Der Algorithmus ist ziemlich einfach.

Nur Leafs oder Knoten mit allen Abkömmlingen müssen null sein.

Gültige Pfade:

"path", "to", "end" 
"path", "to", null 
"path", null, null 
null, null, null 

ungültige Pfade:

"path", null, "end" 
null, null, "end" 
null, "to", "end" 
null, "to", null 

ich für Art und Weise suchen sie in einem funktionalen Stil neu zu schreiben.

+1

Ich glaube, Sie haben einige Tippfehler in Ihren "gültigen Pfaden", die Ihre Frage verwirrend machen. Wollten Sie Zitate um "null" setzen? – 4castle

+0

@ 4castle thx, ich reparierte den Tippfehler – Rob

+0

Was ist los mit nicht-funktionalen Lösung? Du hast es selbst gesagt - dein imperativer Algorithmus ist einfach und relativ einfach (ich würde nur eine zweite verschachtelte Weile entfernen, da du sie nicht brauchst). Es wird keinen Nutzen aus funktionalem Neuschreiben ziehen, und höchstwahrscheinlich wird nur die Komplexität zunehmen (ich bin mir fast sicher, dass die funktionale Implementierung eine 'Tuple'-Klasse erfordern würde). –

Antwort

3

In Java 9, Sie

if(path.stream().dropWhile(Objects::nonNull).anyMatch(Objects::nonNull)) 
    throw new Exception("Invalid path"); 

Die Logik ist einfach, zuerst verwenden könnten, fallen alle nicht null Werte, bis die Begegnung eines null Wert (falls vorhanden), dann scheitern, wenn ein non- null Wert folgt.

Da Java 8 fehlt the dropWhile operation, müssen wir eine alternative Operation, z. Verwenden der Collection API anstelle von Stream API:

int firstNull = path.indexOf(null); 
if(firstNull>=0 && path.stream().skip(firstNull).anyMatch(Objects::nonNull)) 
    throw new Exception("Invalid path"); 
+0

Da Sie zu den Top-Benutzern in Java-8 gehören, würden Sie bitte einige Links zu diesem Java-9-Feature hinzufügen? :) –

+2

@Jude Niroshan: Hier gehst du – Holger

Verwandte Themen