zoukankan      html  css  js  c++  java
  • Google Guava 库用法整理

    参考: 
    http://codemunchies.com/2009/10/beautiful-code-with-google-collections-guava-and-static-imports-part-1/(2,3,4) 
    http://blog.publicobject.com 

    更多用法参考http://ajoo.iteye.com/category/119082 

    以前这么用: 
    Java代码  收藏代码
    1. Map<String, Map<Long, List<String>>> map = new HashMap<String, Map<Long,List<String>>>();  

    现在这么用(JDK7将实现该功能): 
    Java代码  收藏代码
    1. Map<String, Map<Long, List<String>>> map = Maps.newHashMap();  


    针对不可变集合: 
    以前这么用: 
    Java代码  收藏代码
    1. List<String> list = new ArrayList<String>();  
    2. list.add("a");  
    3. list.add("b");  
    4. list.add("c");  
    5. list.add("d");  

    现在Guava这么用: 
    Java代码  收藏代码
    1. ImmutableList<String> of = ImmutableList.of("a""b""c""d");  
    2. ImmutableMap<String,String> map = ImmutableMap.of("key1""value1""key2""value2");  


    文本文件读取现在Guava这么用 
    Java代码  收藏代码
    1. File file = new File(getClass().getResource("/test.txt").getFile());  
    2. List<String> lines = null;  
    3. try {  
    4. lines = Files.readLines(file, Charsets.UTF_8);  
    5. catch (IOException e) {  
    6. e.printStackTrace();  
    7. }  


    基本类型比较, 现在Guava这么用: 
    Java代码  收藏代码
    1. int compare = Ints.compare(a, b);  


    Guava中CharMatcher的用法: 
    Java代码  收藏代码
    1. assertEquals("89983", CharMatcher.DIGIT.retainFrom("some text 89983 and more"))  
    2. assertEquals("some text  and more", CharMatcher.DIGIT.removeFrom("some text 89983 and more"))  


    Guava中Joiner的用法: 
    Java代码  收藏代码
    1. int[] numbers = { 12345 };  
    2. String numbersAsString = Joiner.on(";").join(Ints.asList(numbers));  

    另一种写法: 
    Java代码  收藏代码
    1. String numbersAsStringDirectly = Ints.join(";", numbers);  


    Guava中Splitter的用法: 
    Java代码  收藏代码
    1. Iterable split = Splitter.on(",").split(numbsAsString);  

    对于这样的字符串进行切分: 
    Java代码  收藏代码
    1. String testString = "foo , what,,,more,";  
    2. Iterable<String> split = Splitter.on(",").omitEmptyStrings().trimResults().split(testString);  


    Ints中一些用法: 
    Java代码  收藏代码
    1. int[] array = { 12345 };  
    2. int a = 4;  
    3. boolean contains = Ints.contains(array, a);  
    4. int indexOf = Ints.indexOf(array, a);  
    5. int max = Ints.max(array);  
    6. int min = Ints.min(array);  
    7. int[] concat = Ints.concat(array, array2);  


    集合 
    set的交集, 并集, 差集的用法(http://publicobject.com/2008/08/coding-in-small-with-google-collections.html) 
    Java代码  收藏代码
    1. HashSet setA = newHashSet(12345);  
    2. HashSet setB = newHashSet(45678);  
    3.    
    4. SetView union = Sets.union(setA, setB);  
    5. System.out.println("union:");  
    6. for (Integer integer : union)  
    7.     System.out.println(integer);         
    8.    
    9. SetView difference = Sets.difference(setA, setB);  
    10. System.out.println("difference:");  
    11. for (Integer integer : difference)  
    12.     System.out.println(integer);        
    13.    
    14. SetView intersection = Sets.intersection(setA, setB);  
    15. System.out.println("intersection:");  
    16. for (Integer integer : intersection)  
    17.     System.out.println(integer);  


    针对Map的用法: 
    Java代码  收藏代码
    1. MapDifference differenceMap = Maps.difference(mapA, mapB);  
    2.   
    3. differenceMap.areEqual();  
    4. Map entriesDiffering = differenceMap.entriesDiffering();  
    5. Map entriesOnlyOnLeft = differenceMap.entriesOnlyOnLeft();  
    6. Map entriesOnlyOnRight = differenceMap.entriesOnlyOnRight();  
    7. Map entriesInCommon = differenceMap.entriesInCommon();  


    验证与条件检查 
    原来的写法: 
    Java代码  收藏代码
    1. if (count <= 0) {                                                                                           
    2.     throw new IllegalArgumentException("must be positive: " + count);         
    3. }    
    4.       
                
    Guava的写法(Jakarta Commons中有类似的方法): 
    Java代码  收藏代码
    1. Preconditions.checkArgument(count > 0"must be positive: %s", count);  


    一个更酷的用法: 
    Java代码  收藏代码
    1. public PostExample(final String title, final Date date, final String author) {  
    2.     this.title = checkNotNull(title);  
    3.     this.date = checkNotNull(date);  
    4.     this.author = checkNotNull(author);  
    5. }  


    如果一个key对应多个value的Map, 你会怎么处理? 如果还在使用Map<K, List<V>>的话, 你就out了 
    使用MultiMap吧: 
    Java代码  收藏代码
    1. Multimap<Person, BlogPost> multimap = ArrayListMultimap.create();  


    Multimap的另一个使用场景: 
    比如有一个文章数据的map: 
    Java代码  收藏代码
    1. List<Map<String, String>> listOfMaps = mapOf("type""blog""id""292""author""john");  

    如果要按照type分组生成一个List 
    Java代码  收藏代码
    1. Multimap<String, Map<String, String>> partitionedMap = Multimaps.index(     
    2.                 listOfMaps,                                                                                         
    3.                 new Function<Map<String, String>, String>() {                                   
    4.                     public String apply(final Map<String, String> from) {                      
    5.                         return from.get("type");                                                               
    6.                     }                                                                                                     
    7.                 });   
                                                                                                         
    针对集合中只有一个元素的情况: 
    Iterables.getOnlyElement(); 
    这个主要是用来替换Set.iterator.next()或 List.get(0), 而且在测试中使用非常方便, 如果出现0个或者2+则直接抛出异常 

    比较的最大最小值: 
    Comparators.max 
    Comparators.min 

    equals和hashcode的用法: 
    Java代码  收藏代码
    1. public boolean equals(Object o) {  
    2.   if (o instanceof Order) {  
    3.     Order that = (Order)o;  
    4.   
    5.     return Objects.equal(address, that.address)  
    6.         && Objects.equal(targetArrivalDate, that.targetArrivalDate)  
    7.         && Objects.equal(lineItems, that.lineItems);  
    8.   } else {  
    9.     return false;  
    10.   }  
    11. }  
    12.   
    13. public int hashCode() {  
    14.   return Objects.hashCode(address, targetArrivalDate, lineItems);  
    15. }  


    ImmutableList.copyOf的用法: 
    以前这么用: 
    Java代码  收藏代码
    1. public Directions(Address from, Address to, List<Step> steps) {  
    2.   this.from = from;  
    3.   this.to = to;  
    4.   this.steps = Collections.unmodifiableList(new ArrayList<Step>(steps));  
    5. }  

    现在这么用: 
    Java代码  收藏代码
    1. public Directions(Address from, Address to, List<Step> steps) {  
    2.   this.from = from;  
    3.   this.to = to;  
    4.   this.steps = ImmutableList.of(steps);  
    5. }  


    Iterables.concat()的用法: 
    以前这么用: 
    Java代码  收藏代码
    1. public boolean orderContains(Product product) {  
    2.   List<LineItem> allLineItems = new ArrayList<LineItem>();  
    3.   allLineItems.addAll(getPurchasedItems());  
    4.   allLineItems.addAll(getFreeItems());  
    5.   
    6.   for (LineItem lineItem : allLineItems) {  
    7.     if (lineItem.getProduct() == product) {  
    8.       return true;  
    9.     }  
    10.   }  
    11.   
    12.   return false;  
    13. }  

    现在这么用: 
    Java代码  收藏代码
    1. public boolean orderContains(Product product) {  
    2.   for (LineItem lineItem : Iterables.concat(getPurchasedItems(), getFreeItems())) {  
    3.     if (lineItem.getProduct() == product) {  
    4.       return true;  
    5.     }  
    6.   }  
    7.   
    8.   return false;  
    9. }  


    Constraints.constrainedList: 给List操作注入约束逻辑, 比如添加不合法元素直接报错. 
    以前这么写: 
    Java代码  收藏代码
    1. private final List<LineItem> purchases = new ArrayList<LineItem>();  
    2.   
    3. /** 
    4.  * Don't modify this! Instead, call {@link #addPurchase(LineItem)} to add 
    5.  * new purchases to this order. 
    6.  */  
    7. public List<LineItem> getPurchases() {  
    8.   return Collections.unmodifiableList(purchases);  
    9. }  
    10.   
    11. public void addPurchase(LineItem purchase) {  
    12.   Preconditions.checkState(catalog.isOffered(getAddress(), purchase.getProduct()));  
    13.   Preconditions.checkState(purchase.getCharge().getUnits() > 0);  
    14.   purchases.add(purchase);  
    15. }  
    16. 这么写:  
    17. private final List<LineItem> purchases = Constraints.constrainedList(  
    18.     new ArrayList<LineItem>(),  
    19.     new Constraint<LineItem>() {  
    20.       public void checkElement(LineItem element) {  
    21.         Preconditions.checkState(catalog.isOffered(getAddress(), element.getProduct()));  
    22.         Preconditions.checkState(element.getCharge().getUnits() > 0);  
    23.       }  
    24.     });  
    25.   
    26. /** 
    27.  * Returns the modifiable list of purchases in this order. 
    28.  */  
    29. public List<LineItem> getPurchases() {  
    30.   return purchases;  
    31. }  


    不允许插入空值的Set(Constraints的用法): 
    Java代码  收藏代码
    1. Set<String> set = Sets.newHashSet();  
    2. Set<String> constrainedSet = Constraints.constrainedSet(set, Constraints.notNull());  
    3. constrainedSet.add("A");  
    4. constrainedSet.add(null); // NullPointerException here  


    Multimap的用法(允许多值的map): 
    以前这么写: 
    Java代码  收藏代码
    1. Map<Salesperson, List<Sale>> map = new Hashmap<SalesPerson, List<Sale>>();  
    2.   
    3. public void makeSale(Salesperson salesPerson, Sale sale) {  
    4.   List<Sale> sales = map.get(salesPerson);  
    5.   if (sales == null) {  
    6.     sales = new ArrayList<Sale>();  
    7.     map.put(salesPerson, sales);  
    8.   }  
    9.   sales.add(sale);  
    10. }  

    现在这么写: 
    Java代码  收藏代码
    1. Multimap<Salesperson, Sale> multimap   
    2.     = new ArrayListMultimap<Salesperson,Sale>();  
    3.   
    4. public void makeSale(Salesperson salesPerson, Sale sale) {  
    5.   multimap.put(salesperson, sale);  
    6. }  

    以前这么写: 
    Java代码  收藏代码
    1. public Sale getBiggestSale() {  
    2.   Sale biggestSale = null;  
    3.   for (List<Sale> sales : map.values()) {  
    4.     Sale biggestSaleForSalesman  
    5.         = Collections.max(sales, SALE_COST_COMPARATOR);  
    6.     if (biggestSale == null  
    7.         || biggestSaleForSalesman.getCharge() > biggestSale().getCharge()) {  
    8.       biggestSale = biggestSaleForSalesman;  
    9.     }  
    10.   }  
    11.   return biggestSale;  
    12. }  

    现在这么写(需要将map转换成multimap): 
    Java代码  收藏代码
    1. public Sale getBiggestSale() {  
    2.   return Collections.max(multimap.values(), SALE_COST_COMPARATOR);  
    3. }  


    Joiner的用法: 
    以前这样写: 
    Java代码  收藏代码
    1. public class ShoppingList {  
    2.   private List<Item> items = ...;  
    3.   
    4.   ...  
    5.   
    6.   public String toString() {  
    7.     StringBuilder stringBuilder = new StringBuilder();  
    8.     for (Iterator<Item> s = items.iterator(); s.hasNext(); ) {  
    9.       stringBuilder.append(s.next());  
    10.       if (s.hasNext()) {  
    11.         stringBuilder.append(" and ");  
    12.       }  
    13.     }  
    14.     return stringBuilder.toString();  
    15.   }  
    16. }  

    现在这样写: 
    Java代码  收藏代码
    1. public class ShoppingList {  
    2.  private List<Item> items = ...;  
    3.   
    4.  ...  
    5.   
    6.  public String toString() {  
    7.    return Join.join(" and ", items);  
    8.  }  
    9. }  


    Comparators.fromFunction的用法: 
    以前这样写: 
    Java代码  收藏代码
    1. public Comparator<Product> createRetailPriceComparator(  
    2.     final CurrencyConverter currencyConverter) {  
    3.   return new Comparator<Product>() {  
    4.     public int compare(Product a, Product b) {  
    5.       return getRetailPriceInUsd(a).compareTo(getRetailPriceInUsd(b));  
    6.     }  
    7.     public Money getRetailPriceInUsd(Product product) {  
    8.       Money retailPrice = product.getRetailPrice();  
    9.       return retailPrice.getCurrency() == CurrencyCode.USD  
    10.           ? retailPrice  
    11.           : currencyConverter.convert(retailPrice, CurrencyCode.USD);  
    12.     }  
    13.   };  
    14. }  

    现在这样写(感觉也没省多少): 
    Java代码  收藏代码
    1. public Comparator<Product> createRetailPriceComparator(  
    2.     final CurrencyConverter currencyConverter) {  
    3.   return Comparators.fromFunction(new Function<Product,Money>() {  
    4.     /** returns the retail price in USD */  
    5.     public Money apply(Product product) {  
    6.       Money retailPrice = product.getRetailPrice();  
    7.       return retailPrice.getCurrency() == CurrencyCode.USD  
    8.           ? retailPrice  
    9.           : currencyConverter.convert(retailPrice, CurrencyCode.USD);  
    10.     }  
    11.   });  
    12. }  


    BiMap(双向map)的用法: 
    以前的用法: 
    Java代码  收藏代码
    1. private static final Map<Integer, String> NUMBER_TO_NAME;  
    2. private static final Map<String, Integer> NAME_TO_NUMBER;  
    3.   
    4. static {  
    5.   NUMBER_TO_NAME = Maps.newHashMap();  
    6.   NUMBER_TO_NAME.put(1"Hydrogen");  
    7.   NUMBER_TO_NAME.put(2"Helium");  
    8.   NUMBER_TO_NAME.put(3"Lithium");  
    9.     
    10.   /* reverse the map programatically so the actual mapping is not repeated */  
    11.   NAME_TO_NUMBER = Maps.newHashMap();  
    12.   for (Integer number : NUMBER_TO_NAME.keySet()) {  
    13.     NAME_TO_NUMBER.put(NUMBER_TO_NAME.get(number), number);  
    14.   }  
    15. }  
    16.   
    17. public static int getElementNumber(String elementName) {  
    18.   return NUMBER_TO_NAME.get(elementName);  
    19. }  
    20.   
    21. public static string getElementName(int elementNumber) {  
    22.   return NAME_TO_NUMBER.get(elementNumber);  
    23. }  

    现在的用法: 
    Java代码  收藏代码
    1. private static final BiMap<Integer,String> NUMBER_TO_NAME_BIMAP;  
    2.   
    3. static {  
    4.   NUMBER_TO_NAME_BIMAP = Maps.newHashBiMap();  
    5.   NUMBER_TO_NAME_BIMAP.put(1"Hydrogen");  
    6.   NUMBER_TO_NAME_BIMAP.put(2"Helium");  
    7.   NUMBER_TO_NAME_BIMAP.put(3"Lithium");  
    8. }  
    9.   
    10. public static int getElementNumber(String elementName) {  
    11.   return NUMBER_TO_NAME_BIMAP.inverse().get(elementName);  
    12. }  
    13.   
    14. public static string getElementName(int elementNumber) {  
    15.   return NUMBER_TO_NAME_BIMAP.get(elementNumber);  
    16. }  

    换一种写法: 
    Java代码  收藏代码
    1. private static final BiMap<Integer,String> NUMBER_TO_NAME_BIMAP  
    2.   = new ImmutableBiMapBuilder<Integer,String>()  
    3.       .put(1"Hydrogen")  
    4.       .put(2"Helium")  
    5.       .put(3"Lithium")  
    6.       .getBiMap();  


    关于Strings的一些用法(http://blog.ralscha.ch/?p=888): 
    Java代码  收藏代码
    1. assertEquals("test", Strings.emptyToNull("test"));  
    2. assertEquals(" ", Strings.emptyToNull(" "));  
    3. assertNull(Strings.emptyToNull(""));  
    4. assertNull(Strings.emptyToNull(null));  
    5.    
    6. assertFalse(Strings.isNullOrEmpty("test"));  
    7. assertFalse(Strings.isNullOrEmpty(" "));  
    8. assertTrue(Strings.isNullOrEmpty(""));  
    9. assertTrue(Strings.isNullOrEmpty(null));  
    10.    
    11. assertEquals("test", Strings.nullToEmpty("test"));  
    12. assertEquals(" ", Strings.nullToEmpty(" "));  
    13. assertEquals("", Strings.nullToEmpty(""));  
    14. assertEquals("", Strings.nullToEmpty(null));  
    15.    
    16. assertEquals("Ralph_____", Strings.padEnd("Ralph"10'_'));  
    17. assertEquals("Bob_______", Strings.padEnd("Bob"10'_'));  
    18.    
    19. assertEquals("_____Ralph", Strings.padStart("Ralph"10'_'));  
    20. assertEquals("_______Bob", Strings.padStart("Bob"10'_'));  
    21.   
    22. assertEquals("xyxyxyxyxy", Strings.repeat("xy"5));  


    Throwables的用法(将检查异常转换成未检查异常): 
    Java代码  收藏代码
    1. package com.ociweb.jnb.apr2010;  
    2.   
    3. import com.google.common.base.Throwables;  
    4.   
    5. import java.io.InputStream;  
    6. import java.net.URL;  
    7.   
    8. public class ExerciseThrowables {  
    9.     public static void main(String[] args) {  
    10.         try {  
    11.             URL url = new URL("http://ociweb.com");  
    12.             final InputStream in = url.openStream();  
    13.             // read from the input stream  
    14.             in.close();  
    15.         } catch (Throwable t) {  
    16.             throw Throwables.propagate(t);  
    17.         }  
    18.     }  
    19. }  


    Multimap用法整理(http://jnb.ociweb.com/jnb/jnbApr2008.html): 
    用来统计多值出现的频率: 
    Java代码  收藏代码
    1. Multimap<Integer, String> siblings = Multimaps.newHashMultimap();  
    2. siblings.put(0"Kenneth");  
    3. siblings.put(1"Joe");  
    4. siblings.put(2"John");  
    5. siblings.put(3"Jerry");  
    6. siblings.put(3"Jay");  
    7. siblings.put(5"Janet");  
    8.   
    9. for (int i = 0; i < 6; i++) {  
    10.     int freq = siblings.get(i).size();  
    11.     System.out.printf("%d siblings frequency %d ", i, freq);  
    12. }  

    输出结果: 
    引用
            0 siblings frequency 1 
            1 siblings frequency 1 
            2 siblings frequency 1 
            3 siblings frequency 2 
            4 siblings frequency 0 
            5 siblings frequency 1


    Functions(闭包功能) 
    Java代码  收藏代码
    1. Function<String, Integer> strlen = new Function<String, Integer>() {  
    2.     public Integer apply(String from) {  
    3.         Preconditions.checkNotNull(from);  
    4.         return from.length();  
    5.     }  
    6. };  
    7. List<String> from = Lists.newArrayList("abc""defg""hijkl");  
    8. List<Integer> to = Lists.transform(from, strlen);  
    9. for (int i = 0; i < from.size(); i++) {  
    10.     System.out.printf("%s has length %d ", from.get(i), to.get(i));  
    11. }  


    不过这种转换是在访问元素的时候才进行, 下面的例子可以说明: 
    Java代码  收藏代码
    1. Function<String, Boolean> isPalindrome = new Function<String, Boolean>() {  
    2.     public Boolean apply(String from) {  
    3.         Preconditions.checkNotNull(from);  
    4.         return new StringBuilder(from).reverse().toString().equals(from);  
    5.     }  
    6. };  
    7. List<String> from = Lists.newArrayList("rotor""radar""hannah""level""botox");  
    8. List<Boolean> to = Lists.transform(from, isPalindrome);  
    9. for (int i = 0; i < from.size(); i++) {  
    10.     System.out.printf("%s is%sa palindrome ", from.get(i), to.get(i) ? " " : " NOT ");  
    11. }   
    12. // changes in the "from" list are reflected in the "to" list  
    13. System.out.printf(" now replace hannah with megan... ");  
    14. from.set(2"megan");  
    15. for (int i = 0; i < from.size(); i++) {  
    16.     System.out.printf("%s is%sa palindrome ", from.get(i), to.get(i) ? " " : " NOT ");  
    17. }  

  • 相关阅读:
    GitLab 内存使用优化
    记一次 GitLab 的迁移过程
    MAC 最全快捷键
    IDEA中通过Java调用Python脚本报错
    远程服务调用PRC发展史
    分布式&微服务传送门
    (11)MySQL进阶篇SQL优化(InnoDB锁问题排查与解决)
    不懂物理的前端不是好的游戏开发者(一)—— 物理引擎基础
    京东购物小程序 | Taro3 项目分包实践
    浅谈树模型与集成学习-从决策树到GBDT
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318144.html
Copyright © 2011-2022 走看看