【发布时间】:2021-04-13 09:43:48
【问题描述】:
任务是使用 Stream 检查这种类型的字符串“AZ6BYW59UO6CR8BNT7NM 284130”是否满足这些条件:
- 空格前20个大写字母或数字,位数严格为6位
- 空格后6位
这是我到目前为止所做的:
public static boolean validateCode(String input)
{
String[] words = input.split("\\s+");
ArrayList<String> wordList = new ArrayList<String>(Arrays.asList(words));
Stream<Character> left = wordList.get(0).chars().mapToObj(ch -> (char)ch);
Stream<Character> right = wordList.get(1).chars().mapToObj(ch -> (char)ch);
boolean leftIs20 = left
.collect(Collectors.counting()).equals(20L);
boolean leftisAlfaDigit = left
.allMatch(x -> (Character.isDigit(x) || Character.isUpperCase(x)));
boolean leftis6Digits = left.filter(x -> Character.isDigit(x)).equals(6L);
boolean rightAreDigits = right.allMatch(x ->Character.isDigit(x));
boolean rightAre6Digits = right.collect(Collectors.counting()).equals(6L);
return leftIs20 && leftisAlfaDigit && leftis6Digits && rightAreDigits && rightAre6Digits;
}
但是由于流不能被重用,这是错误的,但我不知道如何克服这个问题。
【问题讨论】:
-
您可以每次都重新创建流...但是对于这样的任务,使用正则表达式会简单得多
-
我建议不要使用流,代码不可读,很可能有更简单更好的方法来实现该逻辑。至少对于长度计算 - 为什么要为此使用流??
-
@luk2302 这就是任务 - 使用流
-
@geocodezip 谢谢!是的,我看到了,但是因为我刚刚开始学习 java,所以我不知道如何在我的情况下应用它。
标签: java string arraylist java-stream