2017-09-08 29 views
0

查找输入字符串是否有效 - 条件是字符串length大于5且字符必须是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

为什么不使用正则表达式:'string.matches(“[A-Za-z0-9] {5,}”)'?流看起来没有必要,困难而且效率低下。 –

+0

你能解释你为什么要用stream 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

这两个解决方案都回答了我的问题。第一个是精确和紧凑(并且如您所提及的那样更高效),第二个易于阅读和维护。感谢回复。 –