优雅写Java之一(常见编程技巧)
一、字符串相关
推荐使用Apache Commons Lang3库
创建Empty字符串:return StringUtils.EMPTY; 或者 return “”; 创建重复的字符串:StringUtils.repeat(“abc”, count【重复次数】); 创建带分隔串/符的重复的字符串:StringUtils.repeat(“abc”, “-”, count);
字符串是否为Empty:StringUtils.isEmpty(someStr) 【isNotEmpty】 字符串是否为Blank:StringUtils.isBlank(someStr)【isNotBlank】(""、" “、\t都是Blank) 字符串是否由全字母构成:StringUtils.isAlpha(someStr) 字符串是否由全数字构成:StringUtils.isNumeric(someStr) 字符串是否由字母和数字构成:StringUtils.isAlphanumeric(someStr) 字符串是否等于另一个指定串:StringUtils.equals(someStr, otherStr)和StringUtils.equalsIgnoreCase(someStr, otherStr) 字符串是否包含某个指定字符串:StringUtils.contains(someStr, otherStr)和StringUtils.containsIgnoreCase(someStr, otherStr)【前面是否包含后面】 字符串是否以某个字符串开头:StringUtils.startsWith(someStr, otherStr)和(StringUtils.startsWithIgnoreCase(someStr, otherStr) 字符串是否以列表给的某一个串开头:StringUtils.startsWithAny(“huawei_com”, " “, “h”)和StringUtils.startsWithAny(“jfz.me”, new String[] {“n”, “h”}); 字符串是否以某个字符串结尾:StringUtils.endsWith/endsWithIgnoreCase 字符串是否以列表给的某一个串结尾:StringUtils.endsWithAny(“Huawei_com”, “net”, “com”);
字符串拼接:StringBuilder(线程不安全)、StringBuffer(线程安全) 字符串拼接(逗号分隔):String[] names = {“Zebe”, “Hebe”, “Mary”, “July”, “David”};String result = String.join(”,”, names); 或者 String result = StringUtils.join(names, “,”); 字符串拼接(支持前后缀、分隔符连接): StringJoiner joiner2 = new StringJoiner(",", “{”, “}”); for (final String name : names) {joiner2.add(name);} 字符串拼接(支持前后缀、分隔符连接)Java8: String result = Arrays.stream(names).collect(Collectors.joining(",")); String result2 = Arrays.stream(names).collect(Collectors.joining(",", “{”, “}”)); 带占位符字符串拼接: String msg = MessageFormat.format(“The domain {0} was accessed {1} times.”, domain, times); 默认的整数times被格式化了"10,000",这是个坑,解决:String.valueOf(times)或者 {1,number,#}占位
查找子字符串首次出现的位置(下标0开始): StringUtils.indexOf(someStr, “the”); 或者 StringUtils.indexOfIgnoreCase(someStr, “the”); 查找子字符串末次出现的位置:StringUtils.lastIndexOf(someStr, “the”);或者StringUtils.lastIndexOfIgnoreCase(someStr, “the”); 从某个位置查找子字符串首次出现的位置:StringUtils.indexOf(someStr, “the”, 20); 从某个位置查找子字符串末次出现的位置:StringUtils.lastIndexOf(someStr, “the”, 0); 查找子字符串出现的次数:StringUtils.countMatches(s, “the”)
字符串全部替换:StringUtils.replace(“sshhhs”, “ss”, “p”); StringUtils.replace(“sshhhsshss”, “ss”, “7777”, 2【最大替换次数】); 消除字符串中的所有空格符:StringUtils.replaceAll(" hello \r \r\n world. haha “, “\s+”, “”); 字符串映射列表式替换:StringUtils.replaceEach(“www.github.org/github", new String[] {“github”, “org”}, new String[] {“HUAWEI”, “COM”}); 字符串单次替换:StringUtils.replaceOnce(“sshhhss”, “ss”, “p”); 字符串头尾去空白:StringUtils.trim(” ip = 10.10.10.10 “);
提取指定下标的字符:String helloworld = “Hello, 世界!";helloworld.charAt(0); // ‘H’ 提取指定位置区间的子串:String result = StringUtils.substring(str, start, end); 提取指定分隔串之后的子串: 首次之后:StringUtils.substringAfter(fullClass, “.”) 末次之后:StringUtils.substringAfterLast(fullClass, “.”) 提取指定分隔串之前的子串: 首次之前:StringUtils.substringBefore(fullClass, “.”) 末次之前:StringUtils.substringBeforeLast(fullClass, “.”) 提取指定分隔串之间的子串:StringUtils.substringBetween(log, “[”, “]”)
按指定字符/字符串分割字符串 StringUtils.split(“foo:bar”, ‘:’); // [“foo”, “bar”] StringUtils.split(“foo###bar”, “###”); // [“foo”, “bar”]
按指定正则表达式分割字符串 String[] exampleResult = example.split(”[+\-*/]”); // exampleResult数组[“10”, “20”, “30”, “40”, “50”]
字符串转小写大写:StringUtils.lowerCase(“Name is Yao Ming”, Locale.ENGLISH); StringUtils.upperCase(“Name is Yao Ming”, Locale.ENGLISH);
字符串与Char数组互转:char[] cc = ss.toCharArray();或String ss = String.valueOf(cc); 字符串与Character数组互转:Character[] cc = ss.chars().mapToObj(c -> (char) c).toArray(Character[]::new); 中间转换:char[] cc = string.toCharArray(); Character[] characters = ArrayUtils.toObject(cc);
字符串与Byte数组互转(关键要指定编码): byte[] byteArray = ss.getBytes(StandardCharsets.UTF_8); String restore = new String(bytes, StandardCharsets.UTF_8);
字符串与CharBuffer互转 CharBuffer charBuffer = CharBuffer.wrap(str); String str = charBuffer.toString();
Char数组与CharBuffer互转 CharBuffer charBuffer = CharBuffer.wrap(charArray); CharBuffer charBuffer = CharBuffer.wrap(charArray).asReadOnlyBuffer(); char[] charArray = charBuffer.array();
Byte数组与ByteBuffer互转 ByteBuffer byteBuffer = ByteBuffer.wrap(byteArray); ByteBuffer byteBuffer = ByteBuffer.wrap(byteArray).asReadOnlyBuffer(); byte[] byteArray = new byte[byteBuffer.remaining()]; byteBuffer.get(byteArray, 0, byteArray.length);
CharBuffer与ByteBuffer互转 CharBuffer charBuffer = CharBuffer.wrap(str); Charset cs = Charset.forName(charset); CharsetEncoder coder = cs.newEncoder(); ByteBuffer byteBuffer = coder.encode(charBuffer);
Charset cs = Charset.forName(charset); CharsetDecoder coder = cs.newDecoder(); CharBuffer charBuffer = coder.decode(byteBuffer); String str = charBuffer.toString();