0

Sử dụng multimap của guava để code ngắn gọn

Trong Java collection framework mang đến cho lập trình viên hầu hết các cấu trúc dữ liệu: List, Set, Map, Stack, Queue với vô số các các implement để lựa chọn phù hợp với mục đích sử dụng, một số được dùng phổ biên là: ArrayList, Hasmap, Hashset ... Trên thực tế với những kiểu cấu trúc dữ liệu trên về cơ bản là đủ cho phần lớn các xử lý liên quan đến collection, nhưng đôi khi nó làm cho code trở lên dài và không hiệu quả lắm

Ví dụ về việc phân loại hóa đơn theo type Chúng ta có một danh sách các loại hóa đơn được phân loại theo type, dưới đây là cách thông thường của một lập trình viên java là tạo ra 1 Hashmap với key là billType và value là các danh sách bill cùng type

**Class Bill **

public class Bill {
    private BillType type;
    private String desc;

    public Bill(BillType type, String desc) {
        this.type = type;
        this.desc = desc;
    }

    @Override
    public String toString() {
        return "Bill [type=" + type + ", desc=" + desc + "]";
    }

    public enum BillType {
        VPS_SERVICE(1), ADDITIONAL_IP_ADDRESS(2);
        private int code;

        private BillType(int code) {
            this.code = code;
        }

        public int getCode() {
            return code;
        }
    }

    public BillType getType() {
        return type;
    }

    public void setType(BillType type) {
        this.type = type;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }
}

Phân loại Bill theo type

List<Bill> billList = Arrays.asList(new Bill(BillType.VPS_SERVICE, "2048MB SVZ Cent Os 6"),
		        new Bill(BillType.ADDITIONAL_IP_ADDRESS, "Extra IP Address (New York City)"),
		        new Bill(BillType.ADDITIONAL_IP_ADDRESS, " Extra IP Address (Atlanta City)"),
		        new Bill(BillType.VPS_SERVICE, "1048MB SVZ Ubuntu"),
		        new Bill(BillType.VPS_SERVICE, "2048MB SVZ Ubuntu"),
		        new Bill(BillType.VPS_SERVICE, "3048MB SVZ Ubuntu"));

		Map<Integer, List<Bill>> billInType = new HashMap<>(2);

		for (Bill bill : billList) {
		    List<Bill> bList = billInType.get(bill.getType().getCode());
		    if (bList == null) {
		        bList = new ArrayList<>();
		        billInType.put(bill.getType().getCode(), bList);
		    }
		    bList.add(bill);
		}
		
    System.out.println(billInType.get(BillType.VPS_SERVICE.getCode()));
    System.out.println(billInType.get(BillType.ADDITIONAL_IP_ADDRESS.getCode()));

Kết quả thu được

[Bill [type=VPS_SERVICE, desc=2048MB SVZ Cent Os 6], Bill [type=VPS_SERVICE, desc=1048MB SVZ Ubuntu], Bill [type=VPS_SERVICE, desc=2048MB SVZ Ubuntu], Bill [type=VPS_SERVICE, desc=3048MB SVZ Ubuntu]] [Bill [type=ADDITIONAL_IP_ADDRESS, desc=Extra IP Address (New York City)], Bill [type=ADDITIONAL_IP_ADDRESS, desc= Extra IP Address (Atlanta City)]]

Rõ ràng cách làm trên là khá dài dòng và không được đẹp mắt cho lắm, nhưng đó là cách mà từ khi bắt đầu lập trình với java là hay dùng phổ biến nhất. Để giải quyết những đoạn code if (bList == null)

Sử dụng google Guava's Multimap Thật đơn giả với trường hợp này là đó là cấu trúc dữ liệu multimap, kiểu cấu trúc dữ liệu 1 key có thể dùng được nhiều values Thư viện Google Guava có cung cấp một số loại Multimap mà chúng ta có thể giải quyết bài toán ngắn gọn

Multimap<Integer, Bill> billInType = ArrayListMultimap.create();
for (Bill bill : billList) {
    billInType.put(bill.getType().getCode(), bill);
}

System.out.println(billInType.get(BillType.VPS_SERVICE.getCode()));
System.out.println(billInType.get(BillType.ADDITIONAL_IP_ADDRESS.getCode()));

Kết quả thu được là giống nhau, nhưng số lượng code là ngắn gọn hơn khá nhiều

Với Google Guava cũng cung cấp thêm một số cấu trúc dữ liệu khác như Multiset, Bimap, Table ... Việc sử dụng cấu trúc dữ liệu của google sẽ làm bạn thay đổi được cách viết code Java truyền thống, khiến code trở lên ngắn gọn và dễ hiểu hơn


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí