2017-02-13 4 views
0

アルゴリズムは非常に簡単です機能的なスタイルの検証アルゴリズム

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

階層順序付きリストに保存されているパスとその検証を想像してみてください。

すべての子孫を持つリーフまたはノードのみがnullである必要があります。

有効なパス:

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

無効なパス:

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

私は機能的なスタイルでそれを書き換えるための方法を探しています。

+1

あなたの質問を混乱させる「有効なパス」にいくつかのタイプミスがあると思います。 'null'の周りに引用符を置くことを意味しましたか? – 4castle

+0

@ 4castle thx、私はタイプミスを修正しました – Rob

+0

機能しない解決策は何が問題なのですか?あなたは自分自身で言いました - あなたの命令的アルゴリズムは簡単で比較的単純です(私はあなたがそれを必要としないので、2番目の入れ子になっている間だけ削除します)。関数の書き換えから利益を得ることはなく、たぶん複雑さが増します(関数実装には、例えば、 'Tuple'クラスが必要です)。 –

答えて

3

ジャワ9で、null値(もしあれば)の遭遇するまで、すべての非null値をドロップ、ロジックは最初、単純で

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

使用することができ、次いで、任意の非場合に失敗nullの値が続きます。

Java 8にはthe dropWhile operationが不足しているため、代わりの操作、たとえば、 Stream APIではなくCollection APIを使用しています:

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

あなたがJava-8のトップユーザーになっているように、Java-9の機能に関するいくつかのリンクをお願いしますか? :) –

+2

@Jude Niroshan:ここに行く – Holger