上篇讲到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库详解》 Google Collections,现在被称为Guava库,是Google推出的一个Java工具包,主要用于增强Java的集合框架。这个库包含了丰富的数据结构、工具类和实用方法,极大地提高了开发效率,优化...
google公共工具类;google collections是google的工程师利用传说中的“20%时间”开发的集合库,它是对java.util的扩展,提供了很多实用的类来简化代码。google collections使用了范型,所以要求jdk1.5以上。
google-collections-1.0.jar
### Google Guava Collections 使用介绍 #### 一、概述 Google Guava Collections 是 Java Collections Framework 的一个强大且实用的非官方扩展 API。它由 Google 工程师 Kevin Bourrillion 和 Jared Levy 在著名...
google-collections-1.0-rc2.jar 的jar包,放心使用。
google-collections-1.0-sources.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...
oogle collections是google的工程师利用传说中的“20%时间”开发的集合库,它是对java.util的扩展,提供了很多实用的类来简化代码。google collections使用了范型,所以要求jdk1.5以上。它的作者没有像apache ...
Java的集合框架是Java类库当中使用频率最高的部分之一,而Google Collections库是由Google基于Java5.0 Collections Framework开发的一套新的Java集合框架,提供一些高级集合操作的API。
Collections Collections 是 Java 中的一个集合工具类,提供了多种操作集合的方法。下面是对 Collections 中部分方法的详细解释。 概述 Collections 类是一个集合工具类,它提供了多种操作集合的方法,如查找、...
google-collections-1.0-rc1.jar
但是,如果你的代码依赖于`collections15`中的特定功能,而你的类路径中只有`collections4`,那么就会导致`ClassNotDef`错误。 解决这种问题的方法通常有以下几点: 1. **确认依赖**:确保你的项目配置正确引用了...
Google Collections 是一个由 Google 开发并维护的 Java 库,旨在增强 Java 标准库中的集合框架。这个压缩包 "google-collections.zip" 包含了 "google-collections-1.0.1.jar" 文件,这正是 Google Collections 的...
赠送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....
2. 确保所有依赖此库的组件都已更新,避免因依赖不同版本导致的问题。 3. 如果项目中存在自定义的反序列化逻辑,检查是否需要调整以配合新版本的库。 4. 对于生产环境,应立即更新,以消除潜在的安全风险。 5. 测试...
2. **Gradle依赖**:如果你使用的是Gradle,可以在build.gradle文件中添加: ```groovy implementation 'org.apache.commons:commons-collections4:4.1' ``` 3. **手动添加**:如果项目不使用构建工具,你可以直接将...
Google Collections是Google公司开发的常用工具库,包括对字符串,文件操作,数据结构和并发程序开发的支持。它比Apache Commons Collections提供了更多更强大的函数,使得程序编写更加简洁,不易产生错误。 这个...
Apache Commons Collections是一个Java库,包含了丰富的集合操作工具和算法,为Java平台的开发提供了大量的实用类和接口。这个"commons-collections-3.2.2-"版本是该库的一个特定发行版,主要用于解决WebLogic服务器...
赠送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;...
《Apache Commons Collections 3.2.1:Java集合框架的强大扩展》 Apache Commons Collections是Apache软件基金会的一个项目,它提供了一系列强大的、用于处理Java集合框架的工具类和算法。在这个项目中,`commons-...