StringUtils.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  1. package com.ruoyi.common.utils;
  2. import com.ruoyi.common.core.text.StrFormatter;
  3. import java.util.*;
  4. /**
  5. * 字符串工具类
  6. *
  7. * @author ruoyi
  8. */
  9. public class StringUtils extends org.apache.commons.lang3.StringUtils {
  10. /**
  11. * 空字符串
  12. */
  13. private static final String NULLSTR = "";
  14. /**
  15. * 下划线
  16. */
  17. private static final char SEPARATOR = '_';
  18. /**
  19. * 获取参数不为空值
  20. *
  21. * @param value defaultValue 要判断的value
  22. * @return value 返回值
  23. */
  24. public static <T> T nvl(T value, T defaultValue) {
  25. return value != null ? value : defaultValue;
  26. }
  27. /**
  28. * * 判断一个Collection是否为空, 包含List,Set,Queue
  29. *
  30. * @param coll 要判断的Collection
  31. * @return true:为空 false:非空
  32. */
  33. public static boolean isEmpty(Collection<?> coll) {
  34. return isNull(coll) || coll.isEmpty();
  35. }
  36. /**
  37. * * 判断一个Collection是否非空,包含List,Set,Queue
  38. *
  39. * @param coll 要判断的Collection
  40. * @return true:非空 false:空
  41. */
  42. public static boolean isNotEmpty(Collection<?> coll) {
  43. return !isEmpty(coll);
  44. }
  45. // 整数集合去重
  46. public static List<Long> integerDeduplication(List<Long> integerList) {
  47. List<Long> listTemp = new ArrayList();
  48. for (int i = 0; i < integerList.size(); i++) {
  49. if (!listTemp.contains(integerList.get(i))) {
  50. listTemp.add(integerList.get(i));
  51. }
  52. }
  53. return listTemp;
  54. }
  55. /**
  56. * * 判断一个对象数组是否为空
  57. *
  58. * @param objects 要判断的对象数组
  59. * * @return true:为空 false:非空
  60. */
  61. public static boolean isEmpty(Object[] objects) {
  62. return isNull(objects) || (objects.length == 0);
  63. }
  64. /**
  65. * * 判断一个对象数组是否非空
  66. *
  67. * @param objects 要判断的对象数组
  68. * @return true:非空 false:空
  69. */
  70. public static boolean isNotEmpty(Object[] objects) {
  71. return !isEmpty(objects);
  72. }
  73. /**
  74. * * 判断一个Map是否为空
  75. *
  76. * @param map 要判断的Map
  77. * @return true:为空 false:非空
  78. */
  79. public static boolean isEmpty(Map<?, ?> map) {
  80. return isNull(map) || map.isEmpty();
  81. }
  82. /**
  83. * * 判断一个Map是否为空
  84. *
  85. * @param map 要判断的Map
  86. * @return true:非空 false:空
  87. */
  88. public static boolean isNotEmpty(Map<?, ?> map) {
  89. return !isEmpty(map);
  90. }
  91. /**
  92. * * 判断一个字符串是否为空串
  93. *
  94. * @param str String
  95. * @return true:为空 false:非空
  96. */
  97. public static boolean isEmpty(String str) {
  98. return isNull(str) || NULLSTR.equals(str.trim());
  99. }
  100. /**
  101. * * 判断一个字符串是否为非空串
  102. *
  103. * @param str String
  104. * @return true:非空串 false:空串
  105. */
  106. public static boolean isNotEmpty(String str) {
  107. return !isEmpty(str);
  108. }
  109. /**
  110. * * 判断一个对象是否为空
  111. *
  112. * @param object Object
  113. * @return true:为空 false:非空
  114. */
  115. public static boolean isNull(Object object) {
  116. return object == null;
  117. }
  118. /**
  119. * * 判断一个对象是否非空
  120. *
  121. * @param object Object
  122. * @return true:非空 false:空
  123. */
  124. public static boolean isNotNull(Object object) {
  125. return !isNull(object);
  126. }
  127. /**
  128. * * 判断一个对象是否是数组类型(Java基本型别的数组)
  129. *
  130. * @param object 对象
  131. * @return true:是数组 false:不是数组
  132. */
  133. public static boolean isArray(Object object) {
  134. return isNotNull(object) && object.getClass().isArray();
  135. }
  136. /**
  137. * 去空格
  138. */
  139. public static String trim(String str) {
  140. return (str == null ? "" : str.trim());
  141. }
  142. /**
  143. * 截取字符串
  144. *
  145. * @param str 字符串
  146. * @param start 开始
  147. * @return 结果
  148. */
  149. public static String substring(final String str, int start) {
  150. if (str == null) {
  151. return NULLSTR;
  152. }
  153. if (start < 0) {
  154. start = str.length() + start;
  155. }
  156. if (start < 0) {
  157. start = 0;
  158. }
  159. if (start > str.length()) {
  160. return NULLSTR;
  161. }
  162. return str.substring(start);
  163. }
  164. /**
  165. * 截取字符串
  166. *
  167. * @param str 字符串
  168. * @param start 开始
  169. * @param end 结束
  170. * @return 结果
  171. */
  172. public static String substring(final String str, int start, int end) {
  173. if (str == null) {
  174. return NULLSTR;
  175. }
  176. if (end < 0) {
  177. end = str.length() + end;
  178. }
  179. if (start < 0) {
  180. start = str.length() + start;
  181. }
  182. if (end > str.length()) {
  183. end = str.length();
  184. }
  185. if (start > end) {
  186. return NULLSTR;
  187. }
  188. if (start < 0) {
  189. start = 0;
  190. }
  191. if (end < 0) {
  192. end = 0;
  193. }
  194. return str.substring(start, end);
  195. }
  196. /**
  197. * 格式化文本, {} 表示占位符<br>
  198. * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
  199. * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
  200. * 例:<br>
  201. * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
  202. * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
  203. * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
  204. *
  205. * @param template 文本模板,被替换的部分用 {} 表示
  206. * @param params 参数值
  207. * @return 格式化后的文本
  208. */
  209. public static String format(String template, Object... params) {
  210. if (isEmpty(params) || isEmpty(template)) {
  211. return template;
  212. }
  213. return StrFormatter.format(template, params);
  214. }
  215. /**
  216. * 字符串转set
  217. *
  218. * @param str 字符串
  219. * @param sep 分隔符
  220. * @return set集合
  221. */
  222. public static final Set<String> str2Set(String str, String sep) {
  223. return new HashSet<String>(str2List(str, sep, true, false));
  224. }
  225. /**
  226. * 字符串转list
  227. *
  228. * @param str 字符串
  229. * @param sep 分隔符
  230. * @param filterBlank 过滤纯空白
  231. * @param trim 去掉首尾空白
  232. * @return list集合
  233. */
  234. public static final List<String> str2List(String str, String sep, boolean filterBlank, boolean trim) {
  235. List<String> list = new ArrayList<String>();
  236. if (StringUtils.isEmpty(str)) {
  237. return list;
  238. }
  239. // 过滤空白字符串
  240. if (filterBlank && StringUtils.isBlank(str)) {
  241. return list;
  242. }
  243. String[] split = str.split(sep);
  244. for (String string : split) {
  245. if (filterBlank && StringUtils.isBlank(string)) {
  246. continue;
  247. }
  248. if (trim) {
  249. string = string.trim();
  250. }
  251. list.add(string);
  252. }
  253. return list;
  254. }
  255. /**
  256. * 下划线转驼峰命名
  257. */
  258. public static String toUnderScoreCase(String str) {
  259. if (str == null) {
  260. return null;
  261. }
  262. StringBuilder sb = new StringBuilder();
  263. // 前置字符是否大写
  264. boolean preCharIsUpperCase = true;
  265. // 当前字符是否大写
  266. boolean curreCharIsUpperCase = true;
  267. // 下一字符是否大写
  268. boolean nexteCharIsUpperCase = true;
  269. for (int i = 0; i < str.length(); i++) {
  270. char c = str.charAt(i);
  271. if (i > 0) {
  272. preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1));
  273. } else {
  274. preCharIsUpperCase = false;
  275. }
  276. curreCharIsUpperCase = Character.isUpperCase(c);
  277. if (i < (str.length() - 1)) {
  278. nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1));
  279. }
  280. if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) {
  281. sb.append(SEPARATOR);
  282. } else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) {
  283. sb.append(SEPARATOR);
  284. }
  285. sb.append(Character.toLowerCase(c));
  286. }
  287. return sb.toString();
  288. }
  289. /**
  290. * 是否包含字符串
  291. *
  292. * @param str 验证字符串
  293. * @param strs 字符串组
  294. * @return 包含返回true
  295. */
  296. public static boolean inStringIgnoreCase(String str, String... strs) {
  297. if (str != null && strs != null) {
  298. for (String s : strs) {
  299. if (str.equalsIgnoreCase(trim(s))) {
  300. return true;
  301. }
  302. }
  303. }
  304. return false;
  305. }
  306. /**
  307. * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld
  308. *
  309. * @param name 转换前的下划线大写方式命名的字符串
  310. * @return 转换后的驼峰式命名的字符串
  311. */
  312. public static String convertToCamelCase(String name) {
  313. StringBuilder result = new StringBuilder();
  314. // 快速检查
  315. if (name == null || name.isEmpty()) {
  316. // 没必要转换
  317. return "";
  318. } else if (!name.contains("_")) {
  319. // 不含下划线,仅将首字母大写
  320. return name.substring(0, 1).toUpperCase() + name.substring(1);
  321. }
  322. // 用下划线将原始字符串分割
  323. String[] camels = name.split("_");
  324. for (String camel : camels) {
  325. // 跳过原始字符串中开头、结尾的下换线或双重下划线
  326. if (camel.isEmpty()) {
  327. continue;
  328. }
  329. // 首字母大写
  330. result.append(camel.substring(0, 1).toUpperCase());
  331. result.append(camel.substring(1).toLowerCase());
  332. }
  333. return result.toString();
  334. }
  335. /**
  336. * 驼峰式命名法 例如:user_name->userName
  337. */
  338. public static String toCamelCase(String s) {
  339. if (s == null) {
  340. return null;
  341. }
  342. s = s.toLowerCase();
  343. StringBuilder sb = new StringBuilder(s.length());
  344. boolean upperCase = false;
  345. for (int i = 0; i < s.length(); i++) {
  346. char c = s.charAt(i);
  347. if (c == SEPARATOR) {
  348. upperCase = true;
  349. } else if (upperCase) {
  350. sb.append(Character.toUpperCase(c));
  351. upperCase = false;
  352. } else {
  353. sb.append(c);
  354. }
  355. }
  356. return sb.toString();
  357. }
  358. public static String objToStr(Object obj) {
  359. return obj == null ? "" : String.valueOf(obj);
  360. }
  361. public static String numHandle(String num) {
  362. String[] valueSplit = num.split("\\.");
  363. if (StringUtils.isNumeric(valueSplit[0]) && valueSplit.length > 1) {
  364. if (StringUtils.isNumeric(valueSplit[1])) {
  365. int valueInt = Integer.parseInt(valueSplit[1]);
  366. if (valueInt > 0) {
  367. num = valueSplit[0] + "." + valueSplit[1].substring(0, 2);
  368. } else {
  369. num = valueSplit[0];
  370. }
  371. }
  372. }
  373. return num;
  374. }
  375. /**
  376. * 去掉字符串末尾逗号
  377. */
  378. public static StringBuilder removeTheLastComma(StringBuilder builder){
  379. if (builder.length() > 0) {
  380. builder.deleteCharAt(builder.length()-1);
  381. }
  382. return builder;
  383. }
  384. /**
  385. * 将字符串中存的带双引号的数组,转换成 int 数组
  386. */
  387. public static int[] stringArrayDQMToInt(String content){
  388. // 提取字符串中 [] 中的内容
  389. String stringOne = StringUtils.strip(content,"[]");
  390. // 提取字符串中 “” 中的内容
  391. String stringTwo = stringOne.replace("\"","");
  392. // 提取字符串中逗号分隔的内容并形成 String[]
  393. String[] strings = stringTwo.split(",");
  394. // 将 String[] 转换成 int[]
  395. return Arrays.stream(strings).mapToInt(Integer::parseInt).toArray();
  396. }
  397. /**
  398. * 将字符串中存的数组,转换成 int 数组
  399. */
  400. public static int[] stringArrayToIntArray(String content){
  401. // 提取字符串中 [] 中的内容
  402. String stringOne = StringUtils.strip(content,"[]");
  403. // 提取字符串中逗号分隔的内容并形成 String[]
  404. String[] strings = stringOne.split(",");
  405. // 将 String[] 转换成 int[]
  406. return Arrays.stream(strings).mapToInt(Integer::parseInt).toArray();
  407. }
  408. @SuppressWarnings("unchecked")
  409. public static <T> T cast(Object obj) {
  410. return (T) obj;
  411. }
  412. }