Mục lục
Apache Commoms Lang 3 một thư viện java phổ biến, cung cấp các class tiện ích nhầm mở rộng các chức năng của Java API.
Thư viện này hỗ trợ khá nhiều tính năng từ thao tác string, array, collection, reflection và concurrency, đến việc triển khai một số cấu trúc dữ liệu có thứ tự như Pair, Triples.
Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu về StringUtils class hỗ trợ xử lý chuỗi trong Java.
Maven Dependency
StringUtils được cung cấp trong thư viện Apache Commons Lang 3, để sử dụng StringUtils trước tiên chúng ta cần thêm maven dependency của Apache Commons Lang 3.
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.9</version> </dependency>
Để sử dụng phiên bản Apache Commoms Lang 3 mới nhất các bạn có thể vào trang chủ để download.
StringUtils class
StringUtils class cung cấp rất nhiều method hỗ trợ thao tác với String, tuy nhiên có một số method trùng lặp mà String class cũng đã hỗ trợ như compare() method.
public static int compare(String str1, String str2)
Trong bài viết này chúng ta sẽ bỏ qua các method trùng lặp giữa String class và StringUtils class. Thay vào đó chúng ta sẽ tìm hiểu các method riêng của StringUtils class để xem chúng sẽ giúp được gì nha.
StringUtils Field
StringUtils class định nghĩa sẵn cho chúng ta các hằng số thường sử dụng trong String như EMPTY, SPACE, LF, CR, etc
public static final String SPACE = " "; public static final String EMPTY = ""; public static final String LF = "\n"; public static final String CR = "\r"; public static final int INDEX_NOT_FOUND = -1;
isBlank & isNotBlank
Thông thường, muốn kiểm tra 1 string có rỗng hay không thì chúng ta cần kiểm tra 2 điều kiện #null & != ”
public boolean isNotNull(String str) { return str != null && !str.equals(""); }
Nếu bạn xác định 1 string chỉ chứa 1 hoặc nhiều whitespace là rỗng thì sẽ có vấn đề đấy, như vậy thì chúng ta cần tiền xử lý bỏ các whitespace ở 2 đầu chuỗi rồi mới tiến hành kiểm tra, rắc rối quá phải không?
Sử dụng isBlank() và isNotBlank() sẽ gói gọn các bước cần thực hiện trên để kiểm tra chuỗi.
StringUtils.isNotBlank(""); // FALSE StringUtils.isNotBlank( " "); // FALSE StringUtils.isNotBlank( null); // FALSE StringUtils.isBlank(""); // TRUE StringUtils.isBlank( " "); // TRUE StringUtils.isBlank( null); // TRUE
containsAny
containsAny() method kiểm tra một string cho trước có chứa một tập các character hoặc một substring hay không?
String string = "shareprogramming.net"; boolean contained1 = StringUtils.containsAny(string, 'a', 'b', 'c'); // TRUE boolean contained2 = StringUtils.containsAny(string, 'x', 'y', 'z'); // FALSE boolean contained3 = StringUtils.containsAny(string, "abc"); // TRUE boolean contained4 = StringUtils.containsAny(string, "xyz"); // FALSE
containsIgnoreCase
containsIgnoreCase() kiểm tra một string có chứa một substring khác hay không mà không phân biệt ký tự hoa, thường.
String string = "shareprogramming.net"; boolean contained = StringUtils.containsIgnoreCase(string, "SHAREPROGRAMMING");
countMatches
countMatches() method đếm số lần xuất hiện của 1 character hoặc một subtring trong một string cho trước.
String string = "welcome to https://shareprogramming.net//"; int charNum = StringUtils.countMatches(string, 'h'); // 2 int charNum2 = StringUtils.countMatches(string, 'H'); // 0 int stringNum = StringUtils.countMatches(string, "com"); // 1
Appending and Prepending Method
appendIfMissing() method sẽ thêm chuỗi suffix vào cuối một chuỗi cho trước nếu nó thiếu suffix ở cuối chuỗi. Tương tự, nhưng appendIfMissingIgnoreCase() không phân biệt ký tự hoa thường.
String stringWithSuffix = StringUtils.appendIfMissing("shareprogramming", ".net"); // shareprogramming.net String stringWithSuffixIgnore = StringUtils.appendIfMissingIgnoreCase("shareprogramming.net", ".NET"); // shareprogramming.net
Tương tự prependIfMissing() và prependIfMissingIgnoreCase() sẽ thêm chuỗi prefix và đầu chuỗi cho trước nếu nó thiếu chuỗi prefix ở đầu chuỗi.
String stringWithPrefix = StringUtils.prependIfMissing("shareprogramming", "https://"); // https://shareprogramming.net/ String stringWithPrefixIgnoreCase = StringUtils.prependIfMissingIgnoreCase("https://shareprogramming", "HTTPS:/"); // https://shareprogramming.net/
reverse && reverseDelimited
StringUtils class cung cấp 2 method reverse() và reverseDelimited() dùng để đảo ngược hoàn toàn hoặc đảo chuỗi theo ký tự ngăn cách.
String originalString = "https://shareprogramming.net//"; String reversedString = StringUtils.reverse(originalString); // /ten.gnimmargorperahs//:sptth
Lưu ý: reverseDelimited(String str, character separatorChar) sẽ ngừng đảo ngược chuỗi cho đến khi gặp được ký tự separatorChar xuất hiện cuối cùng tính từ cuối chuỗi.
String originalString = "https://shareprogramming.net//"; String reversedStringDelimited1 = StringUtils.reverseDelimited(originalString, '.'); // net/.https://shareprogramming String reversedStringDelimited2 = StringUtils.reverseDelimited(originalString, 'n'); // et/ng.nhttps://shareprogrammi
isAllLowerCase & isAllUpperCase
isAllLowerCase(CharSquence str) trả về true khi các ký tự trong chuỗi đều là ký tự thường. Trong khi isAllUpperCase(CharSquence str) trả về true khi các ký tự trong chuỗi đều là ký tự hoa.
boolean isAllLowerCase1 = StringUtils.isAllLowerCase(" "); // FALSE boolean isAllLowerCase2 = StringUtils.isAllLowerCase(" abc "); // FALSE boolean isAllLowerCase3 = StringUtils.isAllLowerCase("abcD"); // FALSE boolean isAllLowerCase4 = StringUtils.isAllLowerCase("abc"); // TRUE boolean isAllUpperCase1 = StringUtils.isAllUpperCase(" "); // FALSE boolean isAllUpperCase2 = StringUtils.isAllUpperCase(" ABC "); // FALSE boolean isAllUpperCase3 = StringUtils.isAllUpperCase("ABCd"); // FALSE boolean isAllUpperCase4 = StringUtils.isAllUpperCase("ABC"); // TRUE
Character processing
StringUtils cung cấp isAlpha(), isAlphanumeric(), isNumeric() để kiểm tra các đặc thù riêng của 1 chuỗi.
boolean isAlpha = StringUtils.isAlpha("abc"); // TRUE boolean isAlphanumeric = StringUtils.isAlphanumeric( "1ab"); // TRUE boolean isNumeric = StringUtils.isNumeric("123"); // TRUE
Tóm lược
StringUtils là một trong những class mình hay sử dụng để thao tác nhanh với String. Theo kinh nghiệm cá nhân mình thấy hầu hết các yêu cầu của mình đều đáp được StringUtils đáp ứng mà không cần phải viết thêm function để xử lý. Code vừa ngắn gọn vừa dễ hiểu, đọc đến tên method thôi là biết nó làm gì rồi đúng không nào!
Nguồn tham khảo