2007年11月8日星期四

Iterables的使用

上篇文章讲了Precondition的用法,比较简单,今天我们就来一个稍微复杂一点的(但是也很好用啊)Iterables类。这个类提供了很多静态方来操作集合对象。我习惯于用例子来讲解。先看一个简单的:
public void testNullList()
{
List list=nwe ArrayList();
assertNotNull(Iterables.getOnlyElement(oneList));
}
这里重要的是getOnlyElement.他判断oneList中是否只包含一个元素,如果是就返回这个对象,如果有0个或这多余1个的元素则会抛出异常。他的一个变体是Iterables.getOnlyElement(oneList,object) 这个方法返回如果集合是空的,那么返回一个默认的object。我想这个类在某些测试的场合下是比较有用的。
有时候我们需要把一个集合中的对象全部复制到另一个集合中,这里有一个简单的addAll方法。
public void testAddAll()
{
assertTrue(Iterables.addAll(targetCollection, sourceIterator));
}
sourceIterator是你要复制的集合数据源,targetCollection是你要复制的目标数据源。
有时候我们的程序中需要判断集合中是否包含空对象,是否包含某个我们已经定义的bean对象,自己写代码非常麻烦,google collection提供了一种非常精致的设计,all 和 any 方法。
第一种方法判断集合中是否全部都是满足条件的对象,第二种方法判断集合中是否至少包含一个符合对象的条件。你可能要问了,我的条件是很多的,可能有各种条件,没关系框架中提供了一个Predicate接口。你只需要实现自己的逻辑就可以了。当然,你也可以用google collection中提供的Predicates工厂类,他提供了很多默认的实现。
Predicate pr = Predicates.isEqualTo(defaultValue);
public void testAll()
{
assertTrue(Iterables.all(twoElementList, pr));
}

public void testAny()
{
assertTrue(Iterables.any(twoElementList, pr));
}

下面列出几个其他的方法:
public void testElementsEqual()
{
//比较两个集合是否相等。
assertTrue(Iterables.elementsEqual(anotherTwoElementList,
twoElementList));
}

public void testFilter()
{
//从一个集合中找出符合TestBean2对象类型的元素,然后组成一个新的集合。
Iterable nList = Iterables.filter(distinctBeanList,
TestBean2.class);
assertNotNull(nList);
for (TestBean2 tb : nList) {
System.out.println(tb);
}
}

public void testFind()
{
//从一个集合中找出符合Predicate条件的对象,并组成一个新的集合。
assertNotNull(Iterables.find(twoElementList, pr));
System.out.println(Iterables.find(twoElementList, pr));
}

public void testFrequery()
{
//找出包含tbean对象类型的元素并组成一个新的集合。
assertEquals(Iterables.frequency(twoElementList, tbean), 1);
}

public void testNewArray()
{
//顾名思义,创建一个新的集合数组。
assertNotNull(Iterables.newArray(numericList, Integer.class));

}

public void testPartition()
{
//这个就比较有意思了,你可以包集合中的元素按照你的需要创建不同的array片段。 假如我们有一个集合{1,2,3,4,5,6,7,8,9,10},下面的方法可以产生[{1,2,3},{4,5,6},{7,8,9},{10,null,null}]的多维数组,如果最后一个参数为false,那么数组的最后一个片段就是{10}
assertNotNull(Iterables.partition(numericList, 3, true));
System.out.println(Iterables.partition(numericList, 3, false));
}

public void testReverse()
{
//这个方法提供一个逆序排序数组的功能。
Iterable numericList2 = Iterables.reverse(numericList);
System.out.println(numericList2);

}

public void testRotate()
{
//提供从某个索引位置重新排序的功能,比如{1,2,3,4,5,6,7,8,9,10}。调用这个方法后就是{6,7,8,9,10,1,2,3,4,5}
System.out.println(Iterables.rotate(numericList, 5));
}

public void testConcat()
{
//两个集合合并的方法。
Iterable newList=Iterables.concat(oneElementList, twoElementList);
for (TestBean tb : newList) {
System.out.println(tb);
}
assertNotNull(newList);

}
public void testCycle(){
//产生一个螺旋数组。
Iterable newList=Iterables.cycle(numericList);
assertNotNull(newList);
}
好了,今天就说到这里吧。

没有评论: