code: public static String toLowerCamel(String str) {
          String s = str;
          if (s == null) {
              return null;
          }
          if (str.isEmpty()) {
              return str;
          }
          // 无下划线或连词符
          if (s.indexOf(SEPARATOR_UNDER_LINE) < 0 && s.indexOf(SEPARATOR_HYPHEN_LINE) < 0) {
              if (Character.isLowerCase(s.charAt(0))) {
                  return s;
              } else if (Pattern.matches("^[A-Z]{2,}", s)) {
                  s = s.toLowerCase();
              }
              return s.substring(0, 1)
                      .toLowerCase() + s.substring(1);
  
          }
          s = s.toLowerCase();
          StringBuilder sb = new StringBuilder(s.length());
          boolean upperCase = false;
          for (int i = 0; i < s.length(); i++) {
              char c = s.charAt(i);
              if (c == SEPARATOR_UNDER_LINE || c == SEPARATOR_HYPHEN_LINE) {
                  upperCase = true;
              } else if (upperCase) {
                  sb.append(Character.toUpperCase(c));
                  upperCase = false;
              } else {
                  sb.append(c);
              }
          }
          return sb.toString();
      }
docs: 小驼峰命名风格字符串
  
  @param str
  待转换字符串
  @return 小驼峰风格字符串
  @author Zhanghongdong