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.
Maven dependency
Để sử dụng Apache Commoms Lang 3 trong project maven, chúng ta cần thêm dependency.
<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 một loạt các method thao tác với string, giảm thiểu các đoạn mã nhàm chán lặp đi lặp lại nhiều lần.
Dưới đây là một số các method thông dụng trong StringUtils.
isBlank
isBlank(CharSequence str) trả về true khi string có giá trị null, chuỗi rỗng hoặc chứa toàn ký tự khoảng trắng.
boolean isBlank1 = StringUtils.isBlank(" "); // TRUE boolean isBlank2 = StringUtils.isBlank(""); // TRUE boolean isBlank3 = StringUtils.isBlank(null); // TRUE boolean isBlank4 = StringUtils.isBlank(" abs "); // FALSE
isEmpty
isEmpty(CharSequence str) trả về true khi string null hoặc chuỗi rỗng.
boolean isEmpty1 = StringUtils.isEmpty(""); // TRUE boolean isEmpty2 = StringUtils.isEmpty(null); // TRUE boolean isEmpty3 = StringUtils.isEmpty(" "); // FALSE boolean isEmpty4 = StringUtils.isEmpty(" abc "); // FALSE
isAllLowerCase
isAllLowerCase(CharSquence str) trả về true khi các ký tự trong chuỗi đều là ký tự thường.
boolean isAllLowerCase1 = StringUtils.isAllLowerCase(" "); // FALSE boolean isAllLowerCase2 = StringUtils.isAllLowerCase(" abc "); // FALSE boolean isAllLowerCase3 = StringUtils.isAllLowerCase("abcD"); // FALSE boolean isAllLowerCase4 = StringUtils.isAllLowerCase("abc"); // TRUE
isAllUpperCase
isAllUpperCase(CharSquence str) trả về true khi các ký tự trong chuỗi đều là ký tự hoa.
boolean isAllUpperCase1 = StringUtils.isAllUpperCase(" "); // FALSE boolean isAllUpperCase2 = StringUtils.isAllUpperCase(" ABC "); // FALSE boolean isAllUpperCase3 = StringUtils.isAllUpperCase("ABCd"); // FALSE boolean isAllUpperCase4 = StringUtils.isAllUpperCase("ABC"); // TRUE
ArrayUtils Class
ArrayUtils class triển khai một loạt các method cho phép chúng ta xử lý và kiểm tra mảng theo nhiều cách khác nhau.
toString
Chuyển một mảng thành chuỗi.
int[] arr = {1, 2, 3}; String str1 = ArrayUtils.toString(arr); // "{1,2,3}" String[] a = {"a", "b", "c"}; String str2 = ArrayUtils.toString(a); // "{a,b,c}" String str3 = ArrayUtils.toString(null, "Array is Null"); // Array is Null
isSameLength
So sánh độ dài của 2 mảng, trả về true khi chúng có độ dài bằng nhau.
int[] array1 = {1, 2, 3}; int[] array2 = {1, 2, 3}; boolean isSameLength = ArrayUtils.isSameLength(array1, array2); // TRUE
indexOf
indexOf(T[] arr, T valueFind, int startIndex) trả về vị trị của valueFind trong mảng arr, và bắt đầu tìm kiếm tại startIndex cho đến cuối mảng.
int[] array = {1, 2, 3}; int index = ArrayUtils.indexOf(arr, 1, 0); // TRUE
NumberUtils class
NumberUtils class cung cấp các method hỗ trợ xử lý các dữ liệu dạng số.
compare
compare() so sánh 2 số có kiểu dữ liệu int, long, short, byte.
int compare1 = NumberUtils.compare(1, 1); // 0 int compare2 = NumberUtils.compare(5L, 2L); // 1 int compare3 = NumberUtils.compare(3L, 5L); // -1
createNumber
Chuyển một string sang số. Ngoài ra nó còn có các biến thể dùng để chuyển sang một kiểu dữ liệu xác định như createDouble – double, createFloat – float etc.
int i = (int)NumberUtils.createNumber("123456"); double d = NumberUtils.createDouble("12243.343"); float f = NumberUtils.createFloat("2442.23");
Fraction class
Trong lập trình java, khi bạn phải thao tác với phân số thì sẽ rất khó khăn và code xử lý phân số sẽ rất phức tạp! Không sao hãy để Fraction class hỗ trợ.
Fraction addFraction1 = Fraction.getFraction(1, 4); Fraction addFraction2 = Fraction.getFraction(3, 4); Fraction add = addFraction1.add(addFraction2); boolean addCompare = add.toString().equals("1/1"); Fraction subFraction1 = Fraction.getFraction(3, 4); Fraction subFraction2 = Fraction.getFraction(1, 4); Fraction subtract = subFraction1.subtract(subFraction2); boolean subCompare = subtract.toString().equals("1/2");
SystemUtils
SystemUtils cho phép truy cập nhanh các thuộc tính cả Java platform hoặc hệ điều hành nơi chương trình khởi chạy.
System.out.println(SystemUtils.getJavaHome()); System.out.println(SystemUtils.getUserDir()); System.out.println(SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_RECENT));
Lazy Initialization
Giả sử bạn muốn khởi tạo một object User class và nó chỉ được khởi tạo khi cần dùng đến. Trong trường hợp này chúng ta cần extends LazyInitializer abstract class và override initialize() method.
package introduce; import org.apache.commons.lang3.concurrent.ConcurrentException; import org.apache.commons.lang3.concurrent.LazyInitializer; public class User { public String name; public String email; public User(String name, String email) { this.name = name; this.email = email; } } public class UserInitializer extends LazyInitializer<User> { @Override protected User initialize() throws ConcurrentException { return new User("your name", "[email protected]"); } } class test { public static void main(String[] agrs) throws ConcurrentException { UserInitializer userInitializer = new UserInitializer(); User user = userInitializer.get(); System.out.println(user.name + " - " + user.email); } }
Output: your name – [email protected]
Khi chúng ta gọi get() method từ LazyInitializer abstract class thì User object mới thật sự được khởi tạo. Method get() đảm bảo chỉ có một User object được khởi tạo, những lần gọi sau sẽ trả về User object tạo ở lần đầu tiên.
private volatile User instance; User get() { if (instance == null) { synchronized(this) { if (instance == null) instance = new User("John", "[email protected]"); } } } return instance; }
ConstructorUtils Class
Reflection là một trong những tính năng nỗi bật của Apache Commoms Lang 3. Nó chứa một số reflection class cho phép chúng ta có thể truy cập và sữa đổi hành vi của một đối tượng tại thời điểm runtime.
Ví dụ chúng ta có thể sử dụng ConstructorUtils#getAccessibleConstructor() để kiểm tra các tham số đầu vào của constructor User class.
boolean isConstructor = ConstructorUtils .getAccessibleConstructor(User.class, String.class, String.class) != null; // true
Hoặc chúng ta có thể khởi tạo một User instance thông qua invokeConstructor() và invokeExactConstructor() method.
User user = ConstructorUtils.invokeConstructor(User.class, "name", "email"); System.out.println(user.name + " - " + user.email);
String[] args = {"name", "email"}; Class[] parameterTypes= {String.class, String.class}; User user = ConstructorUtils.invokeExactConstructor(User.class, args, parameterTypes); System.out.println(user.name + " - " + user.email);
FieldUtils class
Tương tự, chúng ta có thể sử dụng FieldUtils class để truy cập và sữa đổi các thuộc tính trong class.
getField
Sử dụng getField() để lấy giá trị một thuộc tính trong class mà không cần thông qua getter, setter
Field field = FieldUtils.getField(User.class, "name", true); System.out.println(field.getName()); // name Field noneField = FieldUtils.getField(User.class, "none field", true); // null
getAllFields
Method getAllFields() trả về tất cả các thuộc tính của 1 class. Ví dụ chúng ta sẽ lấy tất cả các thuộc tính của User class.
Field[] fields = FieldUtils.getAllFields(User.class); System.out.println(fields.length); // 2
Hoặc chúng ta có thể ghi dữ liệu trực tiếp xuống Object class thông qua writeField() method.
User user = new User("name", "email"); FieldUtils.writeField(user, "name", "new_name", true); System.out.println(user.name); // new_name
MethodUtils class
MethodUtils class cho phép chúng ta truy cập ghi gọi các method trong class tại thời điểm runtime. Giả sử User class có 1 public test() và customName() method.
public class User { // more code public String test() { return "test method"; } public void customName(String name) { this.name = name; } } // --------------------------------------------------------------------------- Method method = MethodUtils.getAccessibleMethod(User.class, "test"); System.out.println(method.getDeclaringClass() + " - " + method.getName()); // Output: class introduce.User - test
Cũng vậy, sử dụng invokeExactMethod() vàinvokeMethod() để gọi 1 method trong 1 class.
String str = (String)MethodUtils.invokeExactMethod(new User("John", "[email protected]"), "test"); // test method User user = new User("name", "email"); MethodUtils.invokeMethod(user, true, "customName", "Custom name"); System.out.println(user.name); // Custom name
MutableObject class
MutableObject class là một wrapper class cho phép chúng ta tạo ra các object immutable. MutableObject chỉ cung cấp getValue() và setValue() mà không cho phép chúng ta sữa đổi trực tiếp các object mà nó bao bên trong. Khi bạn setValue() thì MutableObject chỉ đơn giản là gán giá trị mới thay vì sửa đổi trên Object cũ.
MutableObject<String> mutableObject = new MutableObject<>("init string"); String initValue = mutableObject.getValue();
ImmutablePair class
Tương tự MutableObject, ImmutablePair class tạo ra một cặp object left – right hoặc key – value có tính chất immutable.
ImmutablePair<String, Integer> pair = ImmutablePair.of("left value", 1); System.out.println("Left: " + pair.getLeft() + " - " + "Right: " + pair.getRight()); // Left: left value - Right: 1
Như mong muốn, ImmutablePair class tạo ra các object immutable, mọi cố gắng thay đổi giá trị của value thông qua setValue() đều sẽ bị ném UnsupportedOperationException.
Triple class
Triple class là một abstract class cho phép tạo ra một bộ 3 object đi đôi với nhau thông qua of() method.
Triple triple = Triple.of("leftElement", "middleElement", "rightElement"); System.out.println(triple.getLeft()); // leftElement System.out.println(triple.getMiddle()); // middleElement System.out.println(triple.getRight()); // rightElement
Tóm lược
Qua bài mô ta sơ lược về Apache commoms lang 3, chúng ta đã thấy được nó là một thư viện hỗ trợ rất mạnh cho các Java dev. Nó cũng là 1 thư viện mà mình luôn dùng khi khởi tạo một dự án maven. Mọi tác vụ cơ bản như kiểm tra giá trị null, khởi tạo mảng, ArrayList bằng Apache commoms lang 3 đều rất ngắn gọn và dễ dàng.
Nguồn tham khảo