Apache Commons Lang 3 – Thư viện mà dev Java phải biết

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() 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()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

https://www.baeldung.com/java-commons-lang-3

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x