Mục lục
Trong Java, Pair thể hiện mối quan hệ giữa cặp key-value, chúng sẽ sắp cặp với nhau trong một object, điều này sẽ rất tiện lợi khi chúng ta cần xử lý các tác vụ cần đến một cặp dữ liệu.
Trong Java core cung cấp sẵn Pair class cho chúng ta, ngoài ra chúng ta cũng có thể dùng Pair từ các thư viện thứ 3 như Apache Commoms Lang 3 etc.
Pair class trong Java core
Pair class được đặt trong javafx.util package. Pair class constructor nhận 2 tham số đầu vào là một key và một value tương ứng,
Pair<Integer, String> pair = new Pair<>(1, "One"); Integer key = pair.getKey(); // 1 String value = pair.getValue(); // One
Ví dụ trên tạo một cặp giá trị với key là 1 và “One” là giá trị tương ứng. Chúng ta có thể gọi getKey() và getValue() để lấy giá trị của key và value tương ứng.
Pair class trong Apache Commoms
Trong thư viện Apache commoms, chúng ta có thể tìm thấy Pair class trong org.apache.commoms.lang3.tuple package. Pair class trong Apache commoms là một abstract class, vì vậy chúng ta không thể khởi tạo trực tiếp mà phải thông qua các subclass như ImmutablePair và MutablePair.
Cả 2 subclass đều có các hàm getter, setter. Tuy nhiên khi sử dụng ImmutablePair class, nếu chúng ta gọi setter method sẽ bị quăng UnsupportedOperationException.
Pair<Integer, String> pair = new ImmutablePair<>(2, "Two"); Integer key = pair.getKey(); String value = pair.getValue();
Nếu muốn tạo một Pair object có thể thay đổi sau khi đã khởi tạo, chúng ta phải sử dụng MutablePair thay cho ImmutablePair.
Pair<Integer, String> pair = new MutablePair<>(3, "Three"); pair.setValue("New Three");
Pair class trong thư viện Vavr
Thư viện Vavr Tuple2 class hoạt động tương tự như Pair class immutable.
Tuple2<Integer, String> pair = new Tuple2<>(4, "Four"); Integer key = pair._1(); String value = pair._2();
Tuple2 object không thể thay đổi sau khi đã khởi tạo. Vì vậy khi chúng thay đổi giá trị bên trong Tuple2 object nó sẽ khởi tạo một object mới bao gồm các giá trị được thay đổi và trả về.
tuplePair = pair.update2("New Four");
Thay thế Pair
Cách đơn giản nhất là chúng ta có thể tạo ra một class chứa 2 thuộc tính tương ứng với cặp key-value.
public class CustomPair { private String key; private String value; // getters and setters }
Hoặc đơn giản hơn, chúng ta có thể tạo mảng 2 phần tử, với phần tử đầu tiên là key và phần tử thứ 2 là value.
private Object[] getPair() { // ... return new Object[] {key, value}; }
Tuy nhiên 2 cách trên có nhược điểm rất lớn là không thể thay đổi kiểu dữ kiệu cho key-value khi có nhu cầu. Cho nên chúng ta sẽ áp dụng generics trong Java để xây dựng một CustomPair class có chức năng tương tự nhé.
public class CustomPair<K, V> { private K key; private V value; private CustomPair(){} private CustomPair(K k, V v) { this.key = k; this.value = v; } public static <K, V> CustomPair of (K key, V value) { return new CustomPair<>(key, value); } public K getKey() { return this.key; } public V getValue() { return value; } }
Tóm lược
Chúng ta có thể tạo một class với 2 thuộc tính đi đôi để thay thế Pair trong Java. Thế nhưng tạo sao lại không dùng thứ có sẵn mà phải tạo mới chi phải không nào? Hơn nữa khi nhìn vào cấu trúc Pair<Key, Value> chúng ta sẽ có cái nhìn trực quan hơn khi mà có thể thấy chúng ở code hiện tại chứ không cần vào bên trong nội tại class để xem.
Một lợi thế nữa là chúng ta có thể kết hợp dễ dàng các cặp key-value với nhau mà nếu như chúng ta tạo class riêng thì có vẽ sẽ tạo ra rất nhiều class khi có nhu cầu kết hợp nhiều cặp đôi với nhau đấy.
Nguồn tham khảo