Это должно работать. Использует кодовые точки, что приятно. Это немного расточительно с двухпотоковым представлением символов в виде значений кодовой точки, но это элегантно, что приятно. Определенно не самый производительный кусок кода.
private static boolean valid(char[] id, int minimumLength, int minimumDigits, int minimumUppercase, int firstNLetter) {
if (id.length < minimumLength) {
return false;
}
String idAsString = new String(id);
if (!idAsString.codePoints().limit(firstNLetter).allMatch(Character::isLetter)) {
return false;
}
if (idAsString.codePoints().filter(Character::isDigit).count() < minimumDigits) {
return false;
}
return idAsString.codePoints().filter(Character::isUpperCase).count() >= minimumUppercase;
}
boolean first = valid("GE7IMTWIK5".toCharArray(), 8, 2, 2, 2);
boolean second = valid("FRUMT3UMPO".toCharArray(), 8, 2, 2, 2);
System.out.println(String.format("first=%s, second=%s", first, second));
first=true, second=false