`

带你领略 Google Collections 2

阅读更多

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

 

1,Preconditions

 

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

 

Before:

public Delivery createDelivery(Order order, User deliveryPerson) {
    
    if(order.getAddress() == null) {
        throw new NullPointerException("order address");
    }
    
    if(!workSchedule.isOnDuty(deliveryPerson, order.getArrivalTime())) {
        throw new IllegalArgumentException(
            String.format("%s is not on duty for %s", deliveryPerson, order));
    }

    return new RealDelivery(order, deliveryPerson);
}

 After:

public Delivery createDelivery(Order order, User deliveryPerson) {
    Preconditions.checkNotNull(order.getAddress(), "order address");
    Preconditions.checkArgument(
        workSchedule.isOnDuty(deliveryPerson, order.getArrivalTime()),
            "%s is not on duty for %s", deliveryPerson, order);

    return new RealDelivery(order, deliveryPerson);
}
 

2,Iterables.getOnlyElement

 

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

 

Before:

public void testWorkSchedule() {
    workSchedule.scheduleUserOnDuty(jesse, mondayAt430pm, mondayAt1130pm);

    Set<User> usersOnDuty = workSchedule.getUsersOnDuty(mondayAt800pm);
    assertEquals(1, usersOnDuty.size());
    assertEquals(jesse, usersOnDuty.iterator().next());
}

 After:

public void testWorkSchedule() {
    workSchedule.scheduleUserOnDuty(jesse, mondayAt430pm, mondayAt1130pm);

    Set<User> usersOnDuty = workSchedule.getUsersOnDuty(mondayAt800pm);
    assertEquals(jesse, Iterables.getOnlyElement(usersOnDuty));
}

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


3,Objects.equal

 

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

 

Before:

public boolean equals(Object o) {
    if (o instanceof Order) {
      Order that = (Order)o;

      return (address != null 
              ? address.equals(that.address) 
              : that.address == null) 
          && (targetArrivalDate != null 
              ? targetArrivalDate.equals(that.targetArrivalDate) 
              : that.targetArrivalDate == null)
          && lineItems.equals(that.lineItems);
    } else {
      return false;
    }
}

public int hashCode() {
    int result = 0;
    result = 31 * result + (address != null ? address.hashCode() : 0);
    result = 31 * result + (targetArrivalDate != null ? targetArrivalDate.hashCode() : 0);
    result = 31 * result + lineItems.hashCode();
    return result;
}

 After:

public boolean equals(Object o) {
    if (o instanceof Order) {
      Order that = (Order)o;

      return Objects.equal(address, that.address)
          && Objects.equal(targetArrivalDate, that.targetArrivalDate)
          && Objects.equal(lineItems, that.lineItems);
    } else {
      return false;
    }
}

public int hashCode() {
    return Objects.hashCode(address, targetArrivalDate, lineItems);
}

 

4,Iterables.concat()

 

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

 

Before:

public boolean orderContains(Product product) {
    List<LineItem> allLineItems = new ArrayList<LineItem>();
    allLineItems.addAll(getPurchasedItems());
    allLineItems.addAll(getFreeItems());

    for (LineItem lineItem : allLineItems) {
      if (lineItem.getProduct() == product) {
        return true;
      }
    }

    return false;
}

 After:

public boolean orderContains(Product product) {
    for (LineItem lineItem : Iterables.concat(getPurchasedItems(), getFreeItems())) {
      if (lineItem.getProduct() == product) {
        return true;
      }
    }

    return false;
}

 

5,Join

 

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

 

Before:

public class ShoppingList {
  private List<Item> items = ...;

  ...

  public String toString() {
    StringBuilder stringBuilder = new StringBuilder();
    for (Iterator<Item> s = items.iterator(); s.hasNext(); ) {
      stringBuilder.append(s.next());
      if (s.hasNext()) {
        stringBuilder.append(" and ");
      }
    }
    return stringBuilder.toString();
  }
}
 

After:

public class ShoppingList {
  private List<Item> items = ...;

  ...

  public String toString() {
    return Joiner.on(" and ").join(items);
  }
}

 

6,Maps, Sets and Lists

 

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

 

Before:

Map<CustomerId, BillingOrderHistory> customerOrderHistoryMap 
    = new HashMap<CustomerId, BillingOrderHistory>();

 After:

Map<CustomerId, BillingOrderHistory> customerOrderHistoryMap 
    = Maps.newHashMap();

 

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

 

另一个例子,Before:

Set<String> workdays = new LinkedHashSet<String>();
workdays.add("Monday");
workdays.add("Tuesday");
workdays.add("Wednesday");
workdays.add("Thursday");
workdays.add("Friday");

 OR:

Set<String> workdays = new LinkedHashSet<String>(
  Arrays.asList("Monday", "Tuesday", "Wednesday", "Thursday", "Friday"));

 After:

Set<String> workdays = Sets.newLinkedHashSet(
  "Monday", "Tuesday", "Wednesday", "Thursday", "Friday");

 

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

分享到:
评论

相关推荐

    google-collections jar包

    《Google Collections库详解》 Google Collections,现在被称为Guava库,是Google推出的一个Java工具包,主要用于增强Java的集合框架。这个库包含了丰富的数据结构、工具类和实用方法,极大地提高了开发效率,优化...

    google-collections-1.0.rar

    google公共工具类;google collections是google的工程师利用传说中的“20%时间”开发的集合库,它是对java.util的扩展,提供了很多实用的类来简化代码。google collections使用了范型,所以要求jdk1.5以上。

    google-collections-1.0.jar

    google-collections-1.0.jar

    Google-Guava-Collections-使用介绍

    ### Google Guava Collections 使用介绍 #### 一、概述 Google Guava Collections 是 Java Collections Framework 的一个强大且实用的非官方扩展 API。它由 Google 工程师 Kevin Bourrillion 和 Jared Levy 在著名...

    google-collections-1.0-rc2.jar

    google-collections-1.0-rc2.jar 的jar包,放心使用。

    google-collections-1.0-sources.jar

    google-collections-1.0-sources.jar

    commons-collections.jar

    commons-collections-20040616.jar, commons-collections-3.2-osgi.jar, commons-collections-3.2-sources.jar, commons-collections-3.2.1.jar, commons-collections-3.2.2-javadoc.jar, commons-collections-3.2.2...

    google-collections

    oogle collections是google的工程师利用传说中的“20%时间”开发的集合库,它是对java.util的扩展,提供了很多实用的类来简化代码。google collections使用了范型,所以要求jdk1.5以上。它的作者没有像apache ...

    Google Collections包

    Java的集合框架是Java类库当中使用频率最高的部分之一,而Google Collections库是由Google基于Java5.0 Collections Framework开发的一套新的Java集合框架,提供一些高级集合操作的API。

    Collections

    Collections Collections 是 Java 中的一个集合工具类,提供了多种操作集合的方法。下面是对 Collections 中部分方法的详细解释。 概述 Collections 类是一个集合工具类,它提供了多种操作集合的方法,如查找、...

    google-collections-1.0-rc1.jar

    google-collections-1.0-rc1.jar

    collections4/collections15 jar

    但是,如果你的代码依赖于`collections15`中的特定功能,而你的类路径中只有`collections4`,那么就会导致`ClassNotDef`错误。 解决这种问题的方法通常有以下几点: 1. **确认依赖**:确保你的项目配置正确引用了...

    google-collections.zip

    Google Collections 是一个由 Google 开发并维护的 Java 库,旨在增强 Java 标准库中的集合框架。这个压缩包 "google-collections.zip" 包含了 "google-collections-1.0.1.jar" 文件,这正是 Google Collections 的...

    commons-collections-3.2.2-API文档-中文版.zip

    赠送jar包:commons-collections-3.2.2.jar; 赠送原API文档:commons-collections-3.2.2-javadoc.jar; 赠送源代码:commons-collections-3.2.2-sources.jar; 赠送Maven依赖信息文件:commons-collections-3.2.2....

    commons-collections4-4.1

    2. 确保所有依赖此库的组件都已更新,避免因依赖不同版本导致的问题。 3. 如果项目中存在自定义的反序列化逻辑,检查是否需要调整以配合新版本的库。 4. 对于生产环境,应立即更新,以消除潜在的安全风险。 5. 测试...

    commons-collections4-4.1.jar

    2. **Gradle依赖**:如果你使用的是Gradle,可以在build.gradle文件中添加: ```groovy implementation 'org.apache.commons:commons-collections4:4.1' ``` 3. **手动添加**:如果项目不使用构建工具,你可以直接将...

    Google Collections 源代码和API文档

    Google Collections是Google公司开发的常用工具库,包括对字符串,文件操作,数据结构和并发程序开发的支持。它比Apache Commons Collections提供了更多更强大的函数,使得程序编写更加简洁,不易产生错误。 这个...

    commons-collections-3.2.2-

    Apache Commons Collections是一个Java库,包含了丰富的集合操作工具和算法,为Java平台的开发提供了大量的实用类和接口。这个"commons-collections-3.2.2-"版本是该库的一个特定发行版,主要用于解决WebLogic服务器...

    commons-collections4-4.1-API文档-中文版.zip

    赠送jar包:commons-collections4-4.1.jar; 赠送原API文档:commons-collections4-4.1-javadoc.jar; 赠送源代码:commons-collections4-4.1-sources.jar; 赠送Maven依赖信息文件:commons-collections4-4.1.pom;...

    commons-collections-3.2.1.jar

    《Apache Commons Collections 3.2.1:Java集合框架的强大扩展》 Apache Commons Collections是Apache软件基金会的一个项目,它提供了一系列强大的、用于处理Java集合框架的工具类和算法。在这个项目中,`commons-...

Global site tag (gtag.js) - Google Analytics