Các tính năng mới trong Google Guava

Google Guava cung cấp các thư viện tiện lợi giúp giảm thiểu code trong quá trình phát triển ứng dụng. Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu Guava thông qua bản release 28.2-jre.

Maven dependency

Để sử dụng Goole Guava trong project maven chúng ta cần thêm dependency sau:

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>19.0</version>
  <type>bundle</type>
</dependency>

Các bạn có thể tìm thấy các phiên bản mới hơn tại Google Guave Maven.

commom.base Package

CharMatcher

CharMatcher class được sử dụng để kiểm tra một string theo các yêu cầu cụ thể. 

Ví dụ kiểm tra string chỉ chứa ký tự và số.

boolean result1 = CharMatcher.javaLetterOrDigit().matchesAllOf("someString789"); //TRUE
boolean result2 = CharMatcher.javaLetterOrDigit().matchesAllOf("someSt@ring789"); // FALSE

Hoặc chúng ta có thể đếm số lượng ký số hoặc ký tư trong 1 string như thế này

String number = "8 123 456 123";
int result = CharMatcher.digit().countIn(number); // 10

String text = "shareprogramming.net";
int numberText = CharMatcher.javaLetter().countIn(text); //19

Kiểm tra vị trí của 1 ký tự trong string

CharMatcher.is('j').indexIn("jnj"); // 0

Throwables

Throwables class cung cấp các method xử lý khi có các exception xảy ra. Ví dụ sử dụng lazyStackTrace() để lấy các phần tử trong stacktrace khi có 1 exception được ném ra.

import com.google.common.base.Throwables;
import org.apache.commons.lang3.concurrent.ConcurrentException;

import java.lang.reflect.InvocationTargetException;
import java.util.List;



class test {
    public static void main(String[] agrs) {
        try {
            test();
        } catch (Exception e) {
            List<StackTraceElement> stackTraceElements = Throwables.lazyStackTrace(e);
        }
    }

    public static void test () {
        throw new IllegalArgumentException("hihi");
    }
}

commom.collect Package

FluentIterable.toMultiset()

FluentIterable.toMultiSet() dùng để chuyển một mảng sang một ImmutableMultiSet (implement của MultiSet interface).

User[] usersArray = {new User(1L, "John", 45), new User(2L, "Max", 15)};
ImmutableMultiset<User> users = FluentIterable.of(usersArray).toMultiset()

Một MultiSet là một collection tương tự như Set, điểm khác biệt lớn nhất giữa chúng là Mutiset có thể chứa các phần tử trùng lặp, tuy nhiên chúng ta có thể lấy một dữ liệu duy nhất thông qua elementSet().

class test {
    public static void main(String[] agrs) {
        List<String> userNames = Arrays.asList("David", "Eugen", "Alex", "Alex", "David", "David", "David");

        Multiset<String> userNamesMultiset = HashMultiset.create(userNames);
        Set<String> set = userNamesMultiset.elementSet();
        int size = userNamesMultiset.size(); // 7
        int count = userNamesMultiset.count("David"); // 4

    }
    
}

RangeSet

RangeSet được sử dụng để thao tác trên khoảng giá trị liên tiếp như khoảng (a, z] hoặc [1, 10]. Các instance của RangSet cũng có tính chất tương tự trong các phép toán học như phép giao, phép hợp etc.

RangSet cung cấp các method để tạo khoảng giá trị: closed(), openClosed(), closedOpen(), open(). Trong đó open nghĩa là không lấy giá trị biên, còn closed lấy luôn giá trị biên. open()closed() method sẽ áp dụng cho cả 2 biên dưới và trên. Lưu ý nếu khoảng giá trị không hợp lệ sẽ bị ném IllegalArgumentException.

Ví dụ tạo khoảng giá trị [1, 10] ( lấy giá trị biên ở cả 2 đầu)

RangeSet<Integer> rangeSet = TreeRangeSet.create();
rangeSet.add(Range.closed(1, 10));

Nếu thêm vào khoảng [5, 15) thì 2 khoảng [1, 10][5, 15) sẽ giao lại thành [1, 15)

rangeSet.add(Range.closedOpen(5, 15));

Giờ đây, chúng ta có thể kiểm tra các giá trị đơn xem có chứa trong RangeSet hay không với contains() method.

boolean isContains15 = rangeSet.contains(15); // FALSE

boolean isContains5 = rangeSet.contains(5); // TRUE

Hoặc có thể kiểm tra một khoảng giá trị chứa trong một khoảng giá khác với encloses() method.

boolean isContainsRang1_3 = rangeSet.encloses(Range.closed(1, 3)); // TRUE 

boolean isContainsRang1_17 = rangeSet.encloses(Range.closed(1, 17));  // FALSE

Ngoài ra còn 1 số method giúp tạo một khoảng giá từ giá trị được chỉ định đến ±∞ như: Range.greaterThan()Range.lessThan()Range.atLeast()Range.atMost().

Ví dụ tạo khoảng giá trị từ (10 +∞]. 

rangeSet.add(Range.greaterThan(10));

Hoặc [10, +∞]

rangeSet.add(Range.atLeast(10));

common.hash package

Hashing.sha384()

Hashing.sha384() method trả về 1 method triển khai thuật toán SHA-384 algorithm:

int inputData = 15;

HashFunction hashFunction = Hashing.sha384();
HashCode hashCode = hashFunction.hashInt(inputData);
System.out.println(hashCode.toString());

Output: 0904b6277381dcfbdddd6b6c66e4e3e8f83d4690718d8e6f272c891f24773a12feaf8c449fa6e42240a621b2b5e3cda8

commom.reflect package

TypeToken.isSubtypeOf

TypeToken được sử dụng để truy vấn kiểu dữ liệu generics tại thời điểm runtime. Java sẽ không lưu trữ thông tin về generic type tại thời điểm runtime. TypeToken được xem như cứu cánh cho phép chúng ta truy vấn và làm việc với các generic type mà không cần tốn công mở rộng mã nguồn. 

Ví dụ, chúng ta có ArrayList<String>ArrayList<Interger> sử dụng isAssignableFrom() sẽ trả về TRUE mặc dù chúng không thể chuyển qua lại lẫn nhau. 

ArrayList<String> stringList = new ArrayList<>();
ArrayList<Integer> intList = new ArrayList<>();
boolean isAssignableFrom = stringList.getClass().isAssignableFrom(intList.getClass());

Như vậy, với isAssignableFrom() method chúng ta sẽ có các thông tin sai lệnh, để giải quyết vấn đề này google guava cung cấp TypeToken dùng như là một wrapper class bao ngoài các class cần kiểm tra generic type tại thời điểm runtime. 

TypeToken<ArrayList<String>> listString = new TypeToken<ArrayList<String>>() { };
TypeToken<ArrayList<Integer>> integerString = new TypeToken<ArrayList<Integer>>() { };
 
boolean isSupertypeOf = listString.isSupertypeOf(integerString); // FALSE

Ngoài ra chúng ta cũng có thể sử dụng isSubtypeOf(TypeToken) để kiểm tra một class có phải là một subclass của class kia hay không?

TypeToken<ArrayList<String>> stringList = new TypeToken<ArrayList<String>>() { };
TypeToken<List> list = new TypeToken<List>() { };
 
boolean isSubtypeOf = stringList.isSubtypeOf(list);

commom.io package

ByteSource.sizeIfKnown()

Method này trả về số lượng byte của file mà không cần mở một data stream. 

ByteSource charSource = Files.asByteSource(new File("your_path"));
Optional<Long> size = charSource.sizeIfKnown();

Tóm lược

Google Guava là một trong những thư viện Java phổ biến được rất nhiều các developer sử dụng vì tính đơn giản, nhanh gọn mà không cần phải code nhiều như xưa nữa. Tuy nhiên đối với các bạn mới học Java thì nên code chay đi nhé, sau này hẳn dùng

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