博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Google Guava 库用法整理
阅读量:6176 次
发布时间:2019-06-21

本文共 13136 字,大约阅读时间需要 43 分钟。

hot3.png

博客分类:

 

 

参考: 

 (2,3,4)
 
更多用法参考 
以前这么用: 

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的交集, 并集, 差集的用法() 

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. }  

转载于:https://my.oschina.net/messi31/blog/529407

你可能感兴趣的文章
CoreSeek快速安装
查看>>
Linux 网络性能调试工具Netstat
查看>>
我的友情链接
查看>>
报表下载SSH
查看>>
我的友情链接
查看>>
Raid磁盘阵列真的是100%的安全吗?raid有哪些常见的故障?
查看>>
Raid5两块硬盘离线解决方案 -阵列数据恢复案例
查看>>
IBM AIX存储层结构介绍 / 常用命令整理
查看>>
sudo用法简记
查看>>
有关宏定义的一篇文章
查看>>
Kubernetes 基本概念
查看>>
Linux命令:ssh,scp使用及免密码登录
查看>>
我的友情链接
查看>>
在CentOS上编译安装Nginx+实验环境搭建+测试
查看>>
支持二次开发的Zigbee模块(SNAP技术)
查看>>
我的友情链接
查看>>
软件测试常用术语
查看>>
linux磁盘与文件系统管理
查看>>
ORACLE 索引详解
查看>>
第五课_课后习题解答
查看>>