1. 程式人生 > >java基礎--extension package guava(1)

java基礎--extension package guava(1)

圖片 eat override splay ret 需要 out 靜態初始化 transform

1.guava 簡介

Guava 是一個 Google 的基於java1.6的類庫集合的擴展項目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 這些高質量的 API 可以使你的JAVa代 碼更加優雅,更加簡潔,讓你工作更加輕松愉悅。

2.源碼包的簡單說明:
  com.google.common.annotations:普通註解類型。
  com.google.common.base:基本工具類庫和接口。
  com.google.common.cache:緩存工具包,非常簡單易用且功能強大的JVM內緩存。
  com.google.common.collect:帶泛型的集合接口擴展和實現,以及工具類,這裏你會發現很多好玩的集合。
  com.google.common.eventbus:發布訂閱風格的事件總線。
  com.google.common.hash: 哈希工具包。
  com.google.common.io:I/O工具包。
  com.google.common.math:原始算術類型和超大數的運算工具包。
  com.google.common.net:網絡工具包。
  com.google.common.primitives:八種原始類型和無符號類型的靜態工具包。
  com.google.common.reflect:反射工具包。
  com.google.common.util.concurrent:多線程工具包。

3 類庫使用手冊:

  一. 基本工具類:讓使用Java語言更令人愉悅。

  1. 使用和避免 null:null 有語言歧義, 會產生令人費解的錯誤, 反正他總是讓人不爽。很多 Guava 的工具類在遇到 null 時會直接拒絕或出錯,而不是默默地接受他們。
  2. 前提條件:更容易的對你的方法進行前提條件的測試。
  3. 常見的對象方法: 簡化了Object常用方法的實現, 如 hashCode() 和 toString()。
  4. 排序: Guava 強大的 "fluent Comparator"比較器, 提供多關鍵字排序。
  5. Throwable類: 簡化了異常檢查和錯誤傳播。

  二. 集合類:集合類庫是 Guava 對 JDK 集合類的擴展, 這是 Guava 項目最完善和為人所知的部分。

  1. Immutable collections(不變的集合): 防禦性編程, 不可修改的集合,並且提高了效率。
  2. New collection types(新集合類型):JDK collections 沒有的一些集合類型,主要有:multisets,multimaps,tables, bidirectional maps等等
  3. Powerful collection utilities(強大的集合工具類): java.util.Collections 中未包含的常用操作工具類
  4. Extension utilities(擴展工具類): 給 Collection 對象添加一個裝飾器? 實現叠代器? 我們可以更容易使用這些方法。

  三. 緩存: 本地緩存,可以很方便的操作緩存對象,並且支持各種緩存失效行為模式。

  四. Functional idioms(函數式): 簡潔, Guava實現了Java的函數式編程,可以顯著簡化代碼。

  五. Concurrency(並發):強大,簡單的抽象,讓我們更容易實現簡單正確的並發性代碼。

  1. ListenableFuture(可監聽的Future): Futures,用於異步完成的回調。
  2. Service: 控制事件的啟動和關閉,為你管理復雜的狀態邏輯。

  六. Strings: 一個非常非常有用的字符串工具類: 提供 splitting,joining, padding 等操作。

  七. Primitives: 擴展 JDK 中未提供的對原生類型(如int、char等)的操作, 包括某些類型的無符號的變量。

  八. Ranges: Guava 一個強大的 API,提供 Comparable 類型的範圍處理, 包括連續和離散的情況。

  九. I/O: 簡化 I/O 操作, 特別是對 I/O 流和文件的操作, for Java 5 and 6.

  十. Hashing: 提供比 Object.hashCode() 更復雜的 hash 方法, 提供 Bloom filters.

  十一. EventBus: 基於發布-訂閱模式的組件通信,但是不需要明確地註冊在委托對象中。

  十二. Math: 優化的 math 工具類,經過完整測試。

  十三. Reflection: Guava 的 Java 反射機制工具類。

4.代碼區

技術分享圖片
package com.zwj.gua;


import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.google.common.collect.ImmutableList;

/**
 * 只讀設置
 * @author Administrator
 *
 */
public class Demo01 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        List<String> list =new ArrayList<String>();
        list.add("a");
        list.add("b");
        list.add("c");
        //對原有的list進行包裝,相等於原有List的一個視圖,快照,不夠安全
        List<String> readList =Collections.unmodifiableList(list);
        //java.lang.UnsupportedOperationException
        //readList.add("d");
        //list.add("d"); //改變原有List 視圖也一起改變
        System.out.println(readList);
        //對比 查看 初始化List guava對只讀設置 安全可靠,並且相對簡單
        List<String> immutableList =ImmutableList.of("a", "b", "c"); 
        //immutableList.add("d");//java.lang.UnsupportedOperationException
        System.out.println(immutableList);
        
    }

}
Demo01 只讀設置 技術分享圖片
package com.zwj.gua;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import com.google.common.base.Function;
import com.google.common.base.Functions;
import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;

/**
 * 函數式編程 :解耦
 * 1、Predicate 
 * 2、Function
 * 
 * 工具:Collections2.filter() 過濾器
 * Collections2.transfer() 轉換
 * Functions.compose()組合式函數編程
 * @author Administrator
 *
 */
public class Demo02 {

    /**
     * @param args  
     *  組合式函數編程 過濾出字符長度小於5並且全部大寫
     */
    public static void main(String[] args) {
        //組合式函數編程
        //確保容器中的字符串長度不超過5,超過進行截取,後全部大寫
        List<String> list =Lists.newArrayList("bjsxt","good","happiness");
        //確保容器中的字符串長度不超過5,超過進行截取
        Function<String,String> f1 =new Function<String,String>(){

            @Override
            public String apply(String input) {
                return input.length()>5?input.substring(0,5):input;
            }
            
        };
        //轉成大寫
        Function<String,String> f2 =new Function<String,String>(){

            @Override
            public String apply(String input) {
                return input.toUpperCase();
            }
            
        };
        
        //String =f2(f1(String))
        Function<String,String> f =Functions.compose(f1, f2);
        Collection<String> resultCol =Collections2.transform(list, f);
        
        for(String temp:resultCol){
            System.out.println(temp);
        }
        
    /*BJSXT
GOOD
HAPPI*/
    }
    /**
     * 轉換
     */
    public static void test2(){
        //類型轉換
        Set<Long> timeSet =Sets.newHashSet();
        timeSet.add(10000000L);
        timeSet.add(99999999999999999L);
        timeSet.add(2000000000L);
        
        Collection<String> timeStrCol =Collections2.transform(timeSet, new Function<Long,String>(){

            @Override
            public String apply(Long input) {
                return new SimpleDateFormat("yyyy-MM-dd").format(input);
            }});
    
        for(String temp:timeStrCol){
            System.out.println(temp);
        }

    }
    /**
     * 過濾器     過濾出 反轉後字符串 和 之前一致的
     */
    public static void test1(){
        //創建List 靜態初始化
        List<String> list =Lists.newArrayList("moom","son","dad","bjsxt","refer");
        //找出回文 palindrome  backwords  mirror words
        //匿名內部類對象: 匿名內部類,同時創建類對象
        Collection<String> palindromeList =Collections2.filter(list, new Predicate<String>(){
    
            @Override
            public boolean apply(String input) {
                //業務邏輯
                return new StringBuilder(input).reverse().toString().equals(input);
            }
            
        });
        
        for(String temp:palindromeList){
            System.out.println(temp);
        }
    }
    
}
Demo02 函數式編程 :解耦 技術分享圖片
package com.zwj.gua;

import java.util.Set;


import com.google.common.base.Preconditions;
import com.google.common.collect.Constraint;
import com.google.common.collect.Constraints;
import com.google.common.collect.Sets;

/**
 * 加入約束條件: 非空、長度驗證 的集合
 * Constraint
 * Preconditions
 * Constraints
 * @author Administrator
 *
 */
public class Demo03 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Set<String> sets =Sets.newHashSet();
        //創建約束
        Constraint<String> constraint =new Constraint<String>(){

            @Override
            public String checkElement(String element) {
                //非空驗證
                Preconditions.checkNotNull(element);
                //長度驗證 5-20為字符串
                Preconditions.checkArgument(element.length()>=5 && element.length()<=20);
                                
                return element;
            }
            
        };
        
        Set<String> cs =Constraints.constrainedSet(sets, constraint);
        //cs.add(null); //java.lang.NullPointerException
    //    cs.add("good"); //java.lang.IllegalArgumentException
        cs.add("bjsxt");
        
        for(String str:cs){
            System.out.println(str);
        }
                
        
    }

}
Demo03 加入約束條件: 非空、長度驗證 的集合 技術分享圖片
package com.zwj.gua;
import java.util.Set;

import com.google.common.collect.Sets;
import com.google.common.collect.Sets.SetView;

/**
 * 集合的操作:交集、差集、並集
 * Sets.intersection()
 * Sets.difference()
 * Sets.union();
 * @author Administrator
 *
 */
public class Demo04 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Set<Integer> sets =Sets.newHashSet(1,2,3,4,5,6);
        Set<Integer> sets2 =Sets.newHashSet(3,4,5,6,7,8,9);
        
        //交集
        System.out.println("交集為:");
        SetView<Integer> intersection =Sets.intersection(sets, sets2);
        for(Integer temp:intersection){
            System.out.println(temp);
        }
        //差集
        System.out.println("差集為:");
        SetView<Integer> diff =Sets.difference(sets, sets2);
        for(Integer temp:diff){
            System.out.println(temp);
        }
        //並集
        System.out.println("並集為:");
        SetView<Integer> union =Sets.union(sets, sets2);
        for(Integer temp:union){
            System.out.println(temp);
        }
        
    }

}
Demo04 集合的操作:交集、差集、並集 技術分享圖片
package com.zwj.gua;


import java.util.Set;

import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;

/**
 * 統計單詞出現的次數
 * 1、HashMap 分揀存儲+面向對象思維  -->判斷
 * 2、Multiset :無序+可重復   .count()  增強了可讀性 +操作簡單
 * @author Administrator
 *
 */
public class Demo05 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String str ="this is a cat and that is a mice where is the food";
        //分割字符串
        String[] strArray =str.split(" ");
        //存儲到Multiset中
        Multiset<String> set =HashMultiset.create();
        for(String strTemp:strArray){
            set.add(strTemp);
        }
        
        //獲取所有的單詞 Set
        Set<String> letters =set.elementSet();
        for(String temp:letters){
            System.out.println(temp+"-->"+set.count(temp));
        }
        
        
    }

}
/*mice-->1
that-->1
cat-->1
is-->3
food-->1
a-->2
the-->1
where-->1
this-->1
and-->1
*/
Demo05 統計單詞出現的次數 技術分享圖片
package com.zwj.gua;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;

/**
 * 分析查看 教師  教授的每門課程
 * Multimap :key-value  key可以重復
 * 
 * 
 * @author Administrator
 *
 */
public class Demo06 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Map<String,String> cours =new HashMap<String,String>();
        //加入測試數據
        cours.put("改革開放", "鄧爺爺");
        cours.put("三個代表", "江主席");
        cours.put("科學發展觀", "胡主席");
        cours.put("和諧社會", "胡主席");
        cours.put("八榮八恥", "胡主席");
        cours.put("....", "習主席");
        
        //Multimap
        Multimap<String,String> teachers =ArrayListMultimap.create();
        //叠代器
        Iterator<Map.Entry<String,String>> it =cours.entrySet().iterator();
        while(it.hasNext()){
            Map.Entry<String,String> entry =it.next();
            String key =entry.getKey(); //課程
            String value =entry.getValue(); //教師
            
            //教師 -->課程
            teachers.put(value, key);
        }
        
        
        //查看Multimap
        Set<String> keyset =teachers.keySet();
        for(String key:keyset){
            Collection<String> col =teachers.get(key);
            System.out.println(key+"-->"+col);
        }
        
        
        
    }

}
Demo06 分析查看 教師 教授的每門課程 技術分享圖片
package com.zwj.gua;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;

/**
 * 分析查看 教師  教授的每門課程
 * Multimap :key-value  key可以重復
 * 
 * 
 * @author Administrator
 *
 */
public class Demo06 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Map<String,String> cours =new HashMap<String,String>();
        //加入測試數據
        cours.put("改革開放", "鄧爺爺");
        cours.put("三個代表", "江主席");
        cours.put("科學發展觀", "胡主席");
        cours.put("和諧社會", "胡主席");
        cours.put("八榮八恥", "胡主席");
        cours.put("....", "習主席");
        
        //Multimap
        Multimap<String,String> teachers =ArrayListMultimap.create();
        //叠代器
        Iterator<Map.Entry<String,String>> it =cours.entrySet().iterator();
        while(it.hasNext()){
            Map.Entry<String,String> entry =it.next();
            String key =entry.getKey(); //課程
            String value =entry.getValue(); //教師
            
            //教師 -->課程
            teachers.put(value, key);
        }
        
        
        //查看Multimap
        Set<String> keyset =teachers.keySet();
        for(String key:keyset){
            Collection<String> col =teachers.get(key);
            System.out.println(key+"-->"+col);
        }
        
        
        
    }

}
/*鄧爺爺-->[改革開放]
江主席-->[三個代表]
習主席-->[....]
胡主席-->[科學發展觀, 八榮八恥, 和諧社會]*/
Demo06 分析查看 教師 教授的每門課程 技術分享圖片
package com.zwj.gua;


import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;

/**
 * HashMap 鍵唯一,值可以重復
 * BiMap:雙向Map(Bidirectional Map ) 鍵與值都不能重復(unique -valued map)
 * @author Administrator
 *
 */
public class Demo07 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        BiMap<String,String> bimap=HashBiMap.create();
        bimap.put("bjsxt", "[email protected]");
        bimap.put("good","[email protected]");
        //通過郵箱找用戶
        String user =bimap.inverse().get("[email protected]");
        System.out.println(user);
        System.out.println(bimap.inverse().inverse()==bimap);
        /*good
          true
        */
    }

}
Demo07 :雙向Map(Bidirectional Map ) 鍵與值都不能重復(unique -valued map) 技術分享圖片
package com.zwj.gua;
import java.util.Map;
import java.util.Set;

import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import com.google.common.collect.Table.Cell;
import com.google.common.collect.Tables;

/**
 *  
 * 1、方法
 *  所有的行數據:cellSet()
 *  所有的學生: rowKeySet()
 *  所有的課程:columnKeySet()
 *  所有的成績: values()
 *  學生對應的課程: rowMap() +get(學生)
 *                  row(學生)
 *  課程對應的學生: columnMap +get(課程)
 *                  column(課程)
 * @author Administrator
 *
 */
public class Demo08 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Table<String,String,Integer> tables=HashBasedTable.create();
        //測試數據
        tables.put("a", "javase", 80);
        tables.put("b", "javase", 90);
        tables.put("a", "oracle", 100);
        tables.put("c", "oracle", 95);
        //所有的行數據
        Set<Cell<String,String,Integer>> cells =tables.cellSet();
        for(Cell<String,String,Integer> temp:cells){
            System.out.println(temp.getRowKey()+"-->"+temp.getColumnKey()+"-->"+temp.getValue());
        }
        
        System.out.println("==========學生查看成績==============");
        System.out.print("學生\t");
        //所有的課程
        Set<String> cours =tables.columnKeySet();
        for(String t:cours){
            System.out.print(t+"\t");
        }
        System.out.println();
        //所有的學生
        Set<String> stus =tables.rowKeySet();
        for(String stu:stus){
            System.out.print(stu+"\t");
            Map<String,Integer> scores =tables.row(stu);
            for(String c:cours){
                System.out.print(scores.get(c)+"\t");
            }
            System.out.println();
        }
        
        System.out.println("==========課程查看成績==============");
        System.out.print("課程\t");
        //所有的學生
        Set<String> stuSet =tables.rowKeySet();
        for(String t:stuSet){
            System.out.print(t+"\t");
        }
        System.out.println();
        //所有的課程
        Set<String> courSet =tables.columnKeySet();
        for(String c:courSet){
            System.out.print(c+"\t");
            Map<String,Integer> scores =tables.column(c);
            for(String s:stuSet){
                System.out.print(scores.get(s)+"\t");
            }
            System.out.println();
        }
        System.out.println("===========轉換===========");
        Table<String,String,Integer> tables2 =Tables.transpose(tables);
        //所有的行數據
        Set<Cell<String,String,Integer>> cells2 =tables2.cellSet();
        for(Cell<String,String,Integer> temp:cells2){
            System.out.println(temp.getRowKey()+"-->"+temp.getColumnKey()+"-->"+temp.getValue());
        }
        
    }

}
/*b-->javase-->90
c-->oracle-->95
a-->oracle-->100
a-->javase-->80
==========學生查看成績==============
學生    javase    oracle    
b    90    null    
c    null    95    
a    80    100    
==========課程查看成績==============
課程    b    c    a    
javase    90    null    80    
oracle    null    95    100    
===========轉換===========
javase-->b-->90
oracle-->c-->95
oracle-->a-->100
javase-->a-->80*/
Demo08 雙鍵的Map -->Table -->rowKey+columnKey+value

java基礎--extension package guava(1)