利用apache Collections和google guava對list和map進行過濾和排序

不淨之心發表於2015-09-29
[url]http://www.jiancool.com/article/50723356810/[/url]
在工作中,我們常常需要對List或者Map等集合結果過濾或者排序,這裡我通過使用apache commons和google guava中的方法,簡單實現了一下,方便以後使用。
例子中使用的是apache commons3.1和google-guava14,最新版本是18
apache專案下載地址:http://projects.apache.org/indexes/quick.html
apache Collectoins下載地址:http://commons.apache.org/proper/commons-collections/

[color=red][b] apache程式碼如下:[/b][/color]

對List中的物件按不同屬性排序,請看此
package com.umapp.test;  

public class UserGuava {
private String name;
private int age;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
UserGuava other = (UserGuava) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
public UserGuava(){

}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}






package com.umapp.test;  

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.collections.Predicate;
import org.apache.commons.collections.iterators.FilterIterator;
import org.apache.commons.collections.iterators.UniqueFilterIterator;

public class TestApache {

/**
* @param args
*/
public static void main(String[] args) {
List<UserGuava> list = new ArrayList<UserGuava>();
UserGuava user = new UserGuava();
user.setAge(1);
user.setName("Apple");
list.add(user);
user = new UserGuava();
user.setAge(2);
user.setName("Facebook");
list.add(user);
user = new UserGuava();
user.setAge(3);
user.setName("Twitter");
list.add(user);
user = new UserGuava();
user.setAge(4);
user.setName("Youtube");
list.add(user);
user = new UserGuava();
user.setAge(5);
user.setName("Telerik");
list.add(user);
user = new UserGuava();
user.setAge(6);
user.setName("Google");
list.add(user);
user = new UserGuava();
user.setAge(6);
user.setName("Google");
list.add(user);
Predicate predicate=new Predicate(){
@Override
public boolean evaluate(Object arg0) {
UserGuava u = (UserGuava)arg0;
return u.getAge()>2;
}
};
Iterator<?> iterator=new FilterIterator(list.iterator(),predicate);
while(iterator.hasNext()){
UserGuava u = (UserGuava)iterator.next();
System.out.println(u.getName()+","+u.getAge());
}
System.out.println("-------------------你懂的------------------------");
Iterator iterator1=new UniqueFilterIterator(list.iterator());
while(iterator1.hasNext()){
UserGuava u = (UserGuava)iterator1.next();
System.out.println(u.getName()+","+u.getAge());
}
}

}






列印結果:

Twitter,3

Youtube,4

Telerik,5

Google,6

Google,6

-------------------你懂的------------------------

Apple,1

Facebook,2

Twitter,3

Youtube,4

Telerik,5

Google,6



[color=red][b] google guava程式碼: [/b][/color]
package com.umapp.test;  

import java.util.Comparator;

public class NameComparator implements Comparator<UserGuava> {
@Override
public int compare(UserGuava user, UserGuava user1) {
return user.getName().compareTo(user1.getName());
}
}







package com.umapp.test;  

import java.util.Comparator;

public class AgeComparator implements Comparator<UserGuava> {
@Override
public int compare(UserGuava user, UserGuava user1) {
return user.getAge() > user1.getAge() ? 1 : (user.getAge() == user1.getAge() ? 0 : -1);
}
}





package com.umapp.test;  

import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;

import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Ordering;

public class TestGuava {

public static void main(String[] args) {
Map<String, UserGuava> map = Maps.newHashMap();
List<UserGuava> list = Lists.newArrayList();
UserGuava user = new UserGuava();
user.setAge(1);
user.setName("JetBrains");
map.put("1", user);
list.add(user);
user = new UserGuava();
user.setAge(2);
user.setName("Apple");
list.add(user);
map.put("2", user);
user = new UserGuava();
user.setAge(3);
user.setName("Telerik");
list.add(user);
map.put("3", user);
user = new UserGuava();
user.setAge(4);
user.setName("Google");
list.add(user);
map.put("4", user);
user = new UserGuava();
user.setAge(5);
user.setName("Twitter");
list.add(user);
map.put("5", user);
user = new UserGuava();
user.setAge(2);
user.setName("Facebook");
list.add(user);
map.put("2", user);
user = new UserGuava();
user.setAge(1);
user.setName("Youtube");
map.put("1", user);
list.add(user);
Predicate<UserGuava> preFilter = new Predicate<UserGuava>(){
@Override
public boolean apply(UserGuava user) {
return user.getAge()>2;
}
};
for (Entry<String, UserGuava> e : map.entrySet()) {
if (preFilter.apply(e.getValue())) {
UserGuava u= (UserGuava)e.getValue();
System.out.println("Map-UserGuava="+u.getName()+","+u.getAge());
}
}
System.out.println("-------------------你懂的------------------------");
for (UserGuava u:list) {
if (preFilter.apply(u)) {
System.out.println("List-UserGuava="+u.getName()+","+u.getAge());
}
}
System.out.println("-------------------你懂的------------------------");
Predicate<UserGuava> p1 = new Predicate<UserGuava> () {
@Override
public boolean apply(UserGuava user) {
if (user == null) {
return false;
}
if (Objects.equals(user.getAge(), 1)) {
return false;
}
return true;
}
};
Predicate<UserGuava> p2 = new Predicate<UserGuava> () {
@Override
public boolean apply(UserGuava user) {
if (user == null) {
return false;
}
if (Objects.equals(user.getAge(), 2)) {
return false;
}
return true;
}
};
Predicate<UserGuava> unionPredicate = Predicates.and(p1, p2);
//兩種處理方式
// List<UserGuava> newUserList = Lists.newArrayList(Iterators.filter(list.iterator(), unionPredicate));
Collection<UserGuava> newUserList =(Collection<UserGuava>) Collections2.filter(list, unionPredicate);
for (UserGuava u:newUserList) {
System.out.println("List-IN-UserGuava="+u.getName()+","+u.getAge());
}
System.out.println("-------------------你懂的------------------------");
//先按年齡,再按名稱排序
Comparator<UserGuava> userComparator = Ordering
.from(new AgeComparator()).compound(new NameComparator());

Collections.sort(list, userComparator);
for (UserGuava u:list) {
System.out.println("List-Sort-UserGuava="+u.getName()+","+u.getAge());
}
}

}

列印結果:



Map-UserGuava=Telerik,3

Map-UserGuava=Twitter,5

Map-UserGuava=Google,4

-------------------你懂的------------------------

List-UserGuava=Telerik,3

List-UserGuava=Google,4

List-UserGuava=Twitter,5

-------------------你懂的------------------------

List-IN-UserGuava=Telerik,3

List-IN-UserGuava=Google,4

List-IN-UserGuava=Twitter,5

-------------------你懂的------------------------

List-Sort-UserGuava=JetBrains,1

List-Sort-UserGuava=Youtube,1

List-Sort-UserGuava=Apple,2

List-Sort-UserGuava=Facebook,2

List-Sort-UserGuava=Telerik,3

List-Sort-UserGuava=Google,4

List-Sort-UserGuava=Twitter,5

相關文章