Google Guava14.0 瓜娃學習筆記


Guava 是java api的增強與擴展,提供復雜的java 數據結構,使你的代碼更簡短精煉,具有良好的可讀性。看看guava給我們提供了哪些很酷的功能:

  • 集合創建:
Map<String, Map<String, String>> map = Maps.newHashMap();
List<List<Map<String, String>>> list = Lists.newArrayList();
  • 集合初始化:
Set<String> set = Sets.newHashSet("one","two","three");
List<String> list = Lists.newArrayList("one","two","three");
  • Immutable Collections: 不可變的集合,還在使用 Collections.unmodifiableXXX() ? Immutable Collections 這才是真正的不可修改的集合
 ImmutableSet<String> immutableSet = ImmutableSet.of("RED", "GREEN");

從構造的方式來說,ImmutableSet 集合還提供了 Builder 模式來構造一個集合 :

 Builder<String>  builder = ImmutableSet.builder(); 
 ImmutableSet<String> immutableSet = builder.add("RED").addAll(set).build();
  • MultiMap:一種key可以重復的map,子類有ListMultimap和SetMultimap,對應的通過key分別得到list和set
Multimap<String, Person> customersByType =ArrayListMultimap.create();
customersByType.put("abc", new Person(1, 1, "a", "46546", 1, 20));
customersByType.put("abc", new Person(1, 1, "a", "46546", 1, 30));
  • Multiset:把重復的元素放入集合,並且可以統計重復元素的個數
Multiset<Integer> multiSet = HashMultiset.create();
multiSet.add(10);
multiSet.add(30);
multiSet.add(30);
multiSet.add(40);

System.out.println( multiSet.count(30)); // 2
System.out.println( multiSet.size());    //4
  • Table:相當於有兩個key的map。
Table<Integer,Integer,Person> personTable=HashBasedTable.create();
personTable.put(1,20,new Person(1, 1, "a", "46546", 1, 20));
personTable.put(0,30,new Person(2, 1, "ab", "46546", 0, 30));

// 得到行集合
Map<Integer,Person> rowMap= personTable.row(0);
int maxAge= Collections.max(rowMap.keySet());
  • BiMap:java.util.Map 只能保證 key 的不重復,BiMap 保證 value 也不重復,提供inverse()方法,可以通過key得到value,也可以通過value得到key
//雙向map
BiMap<Integer,String> biMap=HashBiMap.create();
biMap.put(1,"hello");
biMap.put(2,"my");
int value= biMap.inverse().get("my");
  • ClassToInstanceMap:有的時候,你的map的key並不是一種類型,他們是很多類型,你想通過映射他們得到這種類型,guava提供了ClassToInstanceMap滿足了這個目的,除了繼承自Map接口,ClassToInstaceMap提供了方法 T getInstance(Class<T>) 和 T putInstance(Class<T>, T),消除了強制類型轉換。
ClassToInstanceMap<Person> classToInstanceMap =MutableClassToInstanceMap.create();
classToInstanceMap.putInstance(Person.class, new Person(1,20,"abc","46464",1,100));
Person person = classToInstanceMap.getInstance(Person.class);
  • Predicate:謂詞是一個簡單的接口,只有一個方法返回布爾值,但是他是一個很令人驚訝的集合方法,當你結合collections2.filter方法使用,這個篩選方法返回原來的集合中滿足這個謂詞接口的元素。比如要按性別篩選:    
Collections2.filter(personList,new Predicate<Person>() {
    @Override
    public boolean apply( Person input) {
        return input.getSex()==0;
    }
})

  同時可以轉換一個集合為另外一個集合:

Lists.transform(personList,new Function<Person, String>() {
    @Override
    public String apply( Person input) {
        return input.getName();
    }
})
  • MapMaker: 超級強大的 Map 構造類,是用來構造 ConcurrentMap 的工具類
ConcurrentMap<String, Object> mapAll = new MapMaker() 
    .concurrencyLevel(8) 
    .softKeys() 
    .weakValues() 
    .expireAfterWrite(30, TimeUnit.SECONDS) 
    .maximumSize(100) 
    .makeComputingMap( 
      new Function<String, Object>() { 
        public Object apply(String key) { 
          return createObject(key); 
     }});

 

  • Ordering: 非常靈活的排序類,大家知道用 Comparator 作為比較器來對集合排序,但是對於多關鍵字排序 Ordering class 可以簡化很多的代碼
Lists.newArrayList(30, 20, 60, 80, 10);
Ordering.natural().sortedCopy(numbers); //10,20,30,60,80
Ordering.natural().reverse().sortedCopy(numbers); //80,60,30,20,10
Ordering.natural().min(numbers); //10
Ordering.natural().max(numbers); //80
Lists.newArrayList(30, 20, 60, 80, null, 10);
Ordering.natural().nullsLast().sortedCopy(numbers); //10, 20,30,60,80,null
Ordering.natural().nullsFirst().sortedCopy(numbers); //null,10,20,30,60,80
List<Person> personList=Lists.newArrayList(
new Person(3, 1, "abc", "46546", 0, 25),
new Person(2, 1, "ab", "46546", 0, 30),
new Person(5, 1, "ade", "46546",0, 27)
);

Ordering<Person> byAge = new Ordering<Person>() {
    @Override
    public int compare( Person left, Person right) {
        return right.getAge()-left.getAge();
    }
};

for(Person p: byAge.immutableSortedCopy(personList))
{
    System.out.println(p);
}

// 使用ComparisonChain比較多字段

Collections.sort(list, new Comparator<Foo>(){
 @Override return ComparisonChain.start() .compare(f1.a, f2.a, comparatorA) .compare(f1.b, f2.b, comparatorB) .compare(f1.c, f2.c, comparatorC).result(); }});

 

maven坐標:

<dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>14.0-rc2</version>
</dependency>

對於開發人員來說,Guava 確實是一把利器,封裝了許多實用的API,讓我們編寫代碼更簡單易讀,這篇文章是我學習Guava的總結,希望大家能從中有所收獲。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM