code: public static String toLowerCaseWithUnderscore(final String str) {
          if (N.isNullOrEmpty(str)) {
              return str;
          }
  
          String result = lowerCaseWithUnderscorePropNamePool.get(str);
  
          if (result == null) {
              result = StringUtil.toLowerCaseWithUnderscore(str);
              lowerCaseWithUnderscorePropNamePool.put(str, result);
          }
  
          return result;
      }
docs: It's designed for field/method/class/column/table names. and source and target Strings will be cached.
  
  @param str
  @return