1. 程式人生 > >原始碼閱讀之Sets

原始碼閱讀之Sets

 

舉個栗子:

Set<Integer> set1 = Sets.newHashSet(1, 2, 3, 4, 5, 6);
        Set<Integer> set2 = Sets.newHashSet(5, 6, 7, 8, 9, 10);
        Set<Integer> setUnion = Sets.union(set1, set2);//返回兩個集合並集的不可修改檢視
        setUnion.forEach(i -> log.info(i.toString()));
        log.info("-----------------");

        Set<Integer> setInterSection = Sets.intersection(set1, set2);//返回兩個集合交集的不可修改檢視
        setInterSection.forEach(i -> log.info(i.toString()));
        log.info("-----------------");

        Set<Integer> setFilter1 = Sets.filter(set1, i -> i > 3);
        set1.add(0);set1.forEach(i -> log.info("?{}?",i.toString()));
        setFilter1.forEach(i -> log.info(i.toString()));//過濾器。函式式介面Predicate過濾。返回符合條件的元素,可以修改,需要注意的是,修改是修改原來的集合set1

        log.info("--------");
        Set<Integer> setFilter2 = Sets.filter(set2, i -> i > 8);
        setFilter2.forEach(i -> log.info(i.toString()));//過濾器。函式式介面Predicate過濾
        log.info("-----------------");

        Set<Integer> setDifference = Sets.difference(set1,set2);//返回兩個集合並集的不可修改檢視
        setDifference.forEach(i -> log.info(i.toString()));
 
1.Sets.union(set1, set2);

方法寫了很多校驗,然後返回一個新ImmutableSet<E> 把兩個set   裝入,set自動去重 返回。

 

2.Sets.intersection(set1, set2);

用guava 的 Iterators.filter 方法過濾,把set2 做為函式式介面 Predicate 傳入,遍歷 set1 ,如果 set2 中不包括 set1 中的元素,則continue

3.Sets.filter(set1, i -> i > 3);

惰性模式,使用的時候用 Iterators.filter 方法過濾

 

4.Sets.difference(set1,set2);

與Sets.intersection(set1, set2);很類似,只不過傳入 Predicate ,是傳入 Predicates.not(Predicates.in(set2)); 就是 set2 的取非。

處理流程一樣。