`
sungang_1120
  • 浏览: 321553 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

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\n", 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\n", 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\n", from.get(i), to.get(i) ? " " : " NOT ");  
  11. }   
  12. // changes in the "from" list are reflected in the "to" list  
  13. System.out.printf("\nnow replace hannah with megan...\n\n");  
  14. from.set(2"megan");  
  15. for (int i = 0; i < from.size(); i++) {  
  16.     System.out.printf("%s is%sa palindrome\n", from.get(i), to.get(i) ? " " : " NOT ");  
  17. }  

 

分享到:
评论

相关推荐

    我整理的java代码库,使用eclipse工程方式展现

    12. **Java库与框架**:可能包含使用Apache Commons、Google Guava等常用库,以及Spring、Hibernate等框架的示例,帮助开发者更好地理解和应用这些工具。 13. **异常处理**:Java异常处理是程序错误处理的关键,...

    Java常用的插件API整理以及基于JDK的一些方法封装库.zip

    2. Guava:Google推出的高效库,包含集合、缓存、并发、I/O等多方面工具,尤其在处理并发和数据结构方面有显著优势。 3. Lombok:一个可以通过注解自动为类生成getter、setter、构造函数等元数据的库,减少了样板...

    java常用工具类整理

    Java常用工具类整理 本文将详细介绍 Spring 及 Guava 相关工具类的使用说明和代码 demo。这些工具类都是 Java 开发中常用的实用工具,可以帮助开发者快速高效地完成各种任务。 一、Spring 工具类 1. org.spring...

    OTTO官方demo整理工程

    OTTO是Google Guava团队开发的一个轻量级事件总线框架,它主要用于Android应用程序中的组件解耦。在“OTTO官方demo整理工程”中,我们可以深入理解如何在实际项目中运用OTTO框架来提高代码的可维护性和灵活性。 ...

    java_常用jar包整理.rar

    11. **Guava**: Guava 是Google提供的一个Java库,包含了大量的系统级别的实用工具类,如集合、并发、缓存、I/O等。 12. **JUnit.jupiter**: 这是JUnit 5的新测试引擎,提供了更现代的测试API和更灵活的测试配置。 ...

    史上最全谷歌浏览器常用书签,适合java开发人员使用

    此外,可能还包括Spring Framework、Hibernate ORM等框架的官方文档,以及Apache Commons、Guava等常用库的API。 2. **在线编译器与运行平台**:例如CodePen、Repl.it或Jsfiddle,这些平台可以让开发者在浏览器中...

    黑马20天学java视频看完后整理的思维导图

    13. **Java API和库**:介绍常用API,如Math、Date、Calendar,以及第三方库如Apache Commons或Google Guava的使用。 14. **设计模式**:可能涵盖了单例、工厂、观察者、装饰器等常见设计模式的概念和应用场景。 ...

    java学习资源知识点整理

    - **Guava**:Google提供的Java库,包含大量常用的工具类和数据结构。 9. **面试准备** - **集合框架**:深入理解集合类的特性,如ArrayList与LinkedList的性能差异,以及在多线程环境下的选择。 - **IO框架**:...

    java相关jar包.zip

    9. **Google Guava**:guava.jar,提供了许多Java核心库的高级功能,如集合操作、并发工具、I/O操作等。 10. **Jackson或Gson**:如jackson-databind.jar,用于JSON对象与Java对象之间的相互转换。 以上只是列举了...

    整理了一个关于网上java问与答的一个手册

    2. Guava:Google的工具库,包含丰富的数据结构、并发工具、缓存机制等。 以上只是Java编程的一部分知识点,实际开发中还需要理解设计模式、数据库操作、框架应用、测试技巧等多个方面。不断学习和实践,才能真正...

    java开发各种jar包分类

    例如,`log4j.jar`用于日志记录,`slf4j-api.jar`和相应的实现库用于更高级的日志抽象,`commons-lang3.jar`提供了很多实用的工具类,`guava.jar`是Google提供的大量常用工具类库。 在实际开发中,根据项目需求,...

    Android通用流行框架大全【整理】

    - **Glide**:Google推荐的图片加载库,特别适合于处理大量的图片加载,支持多种资源格式和高效的内存管理。 3. **图片处理** - **Picasso-transformations**:为Picasso提供了一系列的图片变换效果,如圆形、...

    Java8新特性之Base64详解_动力节点Java学院整理

    - **Google Guava**:`com.google.common.io.BaseEncoding.base64()` - **net.iharder.Base64** - **MigBase64**:据称是编码速度最快的实现 为了评估不同实现的性能,可以通过编写性能测试代码,对比它们在大量...

Global site tag (gtag.js) - Google Analytics