code: @Nullable
    private static String changeFirstCharCase(String str, boolean toUpperCase) {
      if (isEmpty(str)) {
        return str;
      }
      if (str.length() == 1) {
        return toUpperCase ? str.toUpperCase(Locale.ENGLISH) : str.toLowerCase();
      }
      int pos = 0;
      int len = str.length() - 1;
      while (!Character.isLetterOrDigit(str.charAt(pos)) && len > pos) {
        pos++;
      }
      char firstChar = str.charAt(pos);    
      return str.substring(0, pos) 
          + (toUpperCase ? Character.toUpperCase(firstChar) : Character.toLowerCase(firstChar))
          + str.substring(pos + 1);
    }
docs: Return <code>str</code> modified so that its first character is now an
  lowercase or uppercase character, depending on <code>toUpperCase</code>.
  If <code>str</code> starts with non-alphabetic
  characters, such as quotes or parentheses, the first character is
  determined as the first alphabetic character.