Skip to content
体华 edited this page Jul 7, 2013 · 2 revisions

Beangle-commons-core 1 集合操作和辅助类

  1. 数据分页

如何让一个在集合呈现一种分页的效果呢——需要对集合进行包装。在一些缓存数据和数据后端无法提供分页的基础上,可以采用基于列表的内存分页方式。

val users= new ListBuffer[User]
for(i <- 0 until 1000)  users+=new User(i)

val page=new PagedList(users,20)
while(page.hasNext){
	val one = page.next()
	//do something
}
  1. 数据转换和筛选

有时需要将一个集合的对象转换成另一种对象(Transform),例如将包含有用户名的列表,转换成用户对象,以下列举两个例子。

val userNames=List("admin","jack","john")
val usersCollections.transform(userNames, new Transformer(){
	def transform(arg0:Any):Any= userDao.getUser(arg0.asInstanceOf[String])
});
for(user <- users){
	//dosomething
}

如想提取对象的某个属性作为新的集合,可以使用类似的语句。Beangle提供了PropertyTransformer用以简化这样的写法。例如从User中提取username,可以使用以下语句。

val users=List(one,two,three);
val names=Collections.transform(users, new PropertyTransformer("username"))

筛选集合中符合特定规则的对象,收集(Select)成一个新的集合,也是经常遇到的。例如查找性别为男性的用户。

val  maleUsers=Collections.select(users, new Predicate(){
	def apply(arg0:Object):Any {
		val user=arg0.asInstanceOf[User]
		return (user.getGender().getName.equals(""));
	}
});
  1. 对象比较器

在集合排序过程中,需要提供对象比较器(Comparator)或者集合内对象实现 (Ordered)比较器。以用户为例,下面两种实现方式分别对应两种排序方式。第一种是用户实现 Comparable。

Class User extends Ordered[User]{ 
	var id:Long;
	val name:String; 
	def this(n:String){ 
		name=n; 
	}

	def compare(a:User):Int{ 
		return name.compare(a.name); 
	} 
} 
Sorting.quickSort(users)

第二种采用Comparator:

Class UserNameComparator extends Ordering[User]{ 
	def compare(a:User,b:User) =  a.name compare b.name
}
Sorting.quickSort(users)(new UserNameComparator())

往往我们需要按照指定的属性进行排序,例如按照创建日期、用户名排序。可以使用以下语句进行排序。

Sorting.quickSort((users)(new PropertyComparator("username",true))
// sort by creator's username
Sorting.quickSort(users)(new PropertyComparator("creator.username",true))
//[User,Group] list
Sorting.quickSort(users)(new PropertyComparator("[0].username",true))

Clone this wiki locally