-
Notifications
You must be signed in to change notification settings - Fork 1
Commons core
体华 edited this page Jul 7, 2013
·
2 revisions
- 数据分页
如何让一个在集合呈现一种分页的效果呢——需要对集合进行包装。在一些缓存数据和数据后端无法提供分页的基础上,可以采用基于列表的内存分页方式。
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
}- 数据转换和筛选
有时需要将一个集合的对象转换成另一种对象(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("男"));
}
});- 对象比较器
在集合排序过程中,需要提供对象比较器(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))