带你领略 Google Collections 2

原贴地址:

http://jubin2002.javaeye.com/blog/471698

 

上篇讲到google collections的几个比较主要的点,今天我们来看看其提供的几个小的但是相当有用的东西。

 

1,Preconditions

 

Preconditions 提供了状态校验的方法。

 

Before:

Java代码
  1. public  Delivery createDelivery(Order order, User deliveryPerson) {  
  2.       
  3.     if (order.getAddress() ==  null ) {  
  4.         throw   new  NullPointerException( "order address" );  
  5.     }  
  6.       
  7.     if (!workSchedule.isOnDuty(deliveryPerson, order.getArrivalTime())) {  
  8.         throw   new  IllegalArgumentException(  
  9.             String.format("%s is not on duty for %s" , deliveryPerson, order));  
  10.     }  
  11.   
  12.     return   new  RealDelivery(order, deliveryPerson);  
  13. }  

 After:

Java代码
  1. public  Delivery createDelivery(Order order, User deliveryPerson) {  
  2.     Preconditions.checkNotNull(order.getAddress(), "order address" );  
  3.     Preconditions.checkArgument(  
  4.         workSchedule.isOnDuty(deliveryPerson, order.getArrivalTime()),  
  5.             "%s is not on duty for %s" , deliveryPerson, order);  
  6.   
  7.     return   new  RealDelivery(order, deliveryPerson);  
  8. }  
 

2,Iterables.getOnlyElement

 

Iterables.getOnlyElement 确保你的集合或者迭代器包含了刚好一个元素并且返回该元素。如果他包含0和2+元素,它会抛出RuntimeException。一般在单元测试中使用。

 

Before:

Java代码
  1. public   void  testWorkSchedule() {  
  2.     workSchedule.scheduleUserOnDuty(jesse, mondayAt430pm, mondayAt1130pm);  
  3.   
  4.     Set<User> usersOnDuty = workSchedule.getUsersOnDuty(mondayAt800pm);  
  5.     assertEquals(1 , usersOnDuty.size());  
  6.     assertEquals(jesse, usersOnDuty.iterator().next());  
  7. }  

 After:

Java代码
  1. public   void  testWorkSchedule() {  
  2.     workSchedule.scheduleUserOnDuty(jesse, mondayAt430pm, mondayAt1130pm);  
  3.   
  4.     Set<User> usersOnDuty = workSchedule.getUsersOnDuty(mondayAt800pm);  
  5.     assertEquals(jesse, Iterables.getOnlyElement(usersOnDuty));  
  6. }  

 Iterables.getOnlyElement比Set.iterator().getNext()和List.get(0)描述的更为直接。


3,Objects.equal

 

Objects.equal(Object,Object) and Objects.hashCode(Object...)提供了内建的null处理,能使你实现equals()hashCode()更加简单。

 

Before:

Java代码
  1. public   boolean  equals(Object o) {  
  2.     if  (o  instanceof  Order) {  
  3.       Order that = (Order)o;  
  4.   
  5.       return  (address !=  null    
  6.               ? address.equals(that.address)   
  7.               : that.address == null )   
  8.           && (targetArrivalDate != null    
  9.               ? targetArrivalDate.equals(that.targetArrivalDate)   
  10.               : that.targetArrivalDate == null )  
  11.           && lineItems.equals(that.lineItems);  
  12.     } else  {  
  13.       return   false ;  
  14.     }  
  15. }  
  16.   
  17. public   int  hashCode() {  
  18.     int  result =  0 ;  
  19.     result = 31  * result + (address !=  null  ? address.hashCode() :  0 );  
  20.     result = 31  * result + (targetArrivalDate !=  null  ? targetArrivalDate.hashCode() :  0 );  
  21.     result = 31  * result + lineItems.hashCode();  
  22.     return  result;  
  23. }  

 After:

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

 

4,Iterables.concat()

 

Iterables.concat() 连结多种集合 (比如ArrayList和HashSet) 以至于你能在一行代码里遍历他们:

 

Before:

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

 After:

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

 

5,Join

 

Join 是用分隔符分割字符串变得非常容易。

 

Before:

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

After:

Java代码
  1. public   class  ShoppingList {  
  2.   private  List<Item> items = ...;  
  3.   
  4.   ...  
  5.   
  6.   public  String toString() {  
  7.     return  Joiner.on( " and " ).join(items);  
  8.   }  
  9. }  

 

6,Maps, Sets and Lists

 

泛型是好的,不过他们有些过于罗嗦。

 

Before:

Java代码
  1. Map<CustomerId, BillingOrderHistory> customerOrderHistoryMap   
  2.     = new  HashMap<CustomerId, BillingOrderHistory>();  

 After:

Java代码
  1. Map<CustomerId, BillingOrderHistory> customerOrderHistoryMap   
  2.     = Maps.newHashMap();  

 

Maps, Sets and Lists 包含了工厂方法来创建集合对象。

 

另一个例子,Before:

Java代码
  1. Set<String> workdays =  new  LinkedHashSet<String>();  
  2. workdays.add("Monday" );  
  3. workdays.add("Tuesday" );  
  4. workdays.add("Wednesday" );  
  5. workdays.add("Thursday" );  
  6. workdays.add("Friday" );  

 OR:

Java代码
  1. Set<String> workdays =  new  LinkedHashSet<String>(  
  2.   Arrays.asList("Monday" "Tuesday" "Wednesday" "Thursday" "Friday" ));  

 After:

Java代码
  1. Set<String> workdays = Sets.newLinkedHashSet(  
  2.   "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" );  

 

Google Collections 对于Maps, Sets, Lists, Multimaps, Multisets 都提供了工厂方法 。

你可能感兴趣的:(java,object,Google,null,Collections,equals)