2017-09-08 13 views
0

入力文字列が有効かどうかを調べます。条件は文字列lengthより大きく、文字はa-z, A-Z or 0-9でなければなりません。Java 8ストリームAPIを使用した文字列の長さと文字の検証

有効な文字列:aA12Z22qwertyABCDEF0

有効ではありません:13A12CrW#@**=_+

私はそれが正しいJava 8 streamsを使用して取得しようとしています。私はここに解決策を持っています。質問 - これを行う良い方法がありますか(streamsを使用)?

boolean valid = Stream.of(string) 
    .flatMapToInt(s -> { 
     if (s.length() < 5) return IntStream.of(42); // 42 is a '*' char 
     else return s.chars(); 
     }) 
    .mapToObj(i -> (char) i) 
    .allMatch(c -> Character.isLetterOrDigit(c)); 
System.out.println(valid); 
+2

regex: 'string.matches(" [A-Za-z0-9] {5、} ")'を使うのはなぜですか?ストリームは不要で、難しく、効率が悪いようです。 –

+0

ストリームAPIを使用してなぜそれをしたいのか説明できますか?正規表現と比較してどのような利点がありますか? –

答えて

6

個人的に、私は正規表現を使用したい:あなたはストリームを使用するつもりなら

boolean valid = string.matches("[A-Za-z0-9]{5,}"); 

をしかし、私はこのようにそれを行うだろう:

boolean valid = 
    s.length() >= 5 && 
    s.chars().allMatch(Character::isLetterOrDigit); 

Character.isLetterOrDigitことに注目します(例えば१२३)よりも多くの文字が一致する可能性があります。さらにc < 128を確認することもできます。

+0

スマートな解決策! –

+0

両方の解決策が私の質問に答えます。最初は正確でコンパクトです(言及したように効率的です)。第2のものは読みやすく保守しやすいです。返信いただきありがとうございます。 –

関連する問題