在實際開發中,經常需要把一個列表中的元素,按照特定條件過濾出來,放到一個新的列表中。本文給出了幾個例子,來描述解決這個問題的方法。
我們假設有一個書的List,需要找出其中id分別是3、6、8、9的書。本文介紹了兩種方法來完成這個工作。第一種方法是使用java8支持的lambda表達式,代碼簡潔但是僅能用在java8版本上。第二種方法使用了傳統的方式,可以用在java的舊版本上。
書的實體類:
package blog.zhangchao.csdnBlog;
/**
* 書
* @author zhangchao
*
*/
public class Book {
private String id;
private String name;
public Book(String id, String name) {
super();
this.id = id;
this.name = name;
}
public Book() {
super();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
方法一
如果使用java8,可以用lambda表達式:
package blog.zhangchao.csdnBlog;
import java.util.List;
import java.util.stream.Collectors;
import java.util.ArrayList;
/**
* java8的例子,使用lambda表達式
* @author zhangchao
*
*/
public class Test {
/**
* 准備書的列表數據
* @return
*/
public static List prepareData() {
// 准備書的列表,id是從1到10
List bookList = new ArrayList();
for (int i = 1; i < 11; i++) {
bookList.add(new Book(String.valueOf(i), "book"+i));
}
return bookList;
}
public static void main(String[] args) {
List bookList = prepareData();
// 要被找出的書的ID
ArrayList ids = new ArrayList();
ids.add("3");
ids.add("6");
ids.add("8");
ids.add("9");
// 存放過濾結果的列表
List result = null;
// 使用lambda表達式過濾出結果並放到result列表里,written by zhangchao
result = bookList.stream()
.filter((Book b) -> ids.contains(b.getId()))
.collect(Collectors.toList());
// 打印結果列表
if (result != null && !result.isEmpty()) {
result.forEach((Book b) -> System.out.println(b.getId() + " " + b.getName()));
}
}
}
方法二
如果java版本低於8,那么可以用下面ListUtils這個工具類:
接口ListUtilsHook,它是ListUtils的函數鈎子。
package blog.zhangchao.csdnBlog;
/**
* 用來給ListUtils做函數鈎子的接口。
* @author zhangchao
*
*/
public interface ListUtilsHook {
public boolean test(T t);
}
ListUtils:
package blog.zhangchao.csdnBlog;
import java.util.ArrayList;
import java.util.List;
/**
* 使用到java8以下的版本,避免低版本的java不支持lambda表達式
* @author zhangchao
*
*/
public final class ListUtils {
public static List filter(List list, ListUtilsHook hook) {
ArrayList r = new ArrayList();
for (T t : list) {
if (hook.test(t)) {
r.add(t);
}
}
r.trimToSize();
return r;
}
}
使用方式:
package blog.zhangchao.csdnBlog;
import java.util.ArrayList;
import java.util.List;
/**
* 版本在java8以下的情況下,過濾元素的例子
* @author zhangchao
*
*/
public class Test2 {
/**
* 准備書的列表數據
* @return
*/
public static List prepareData() {
// 准備書的列表,id是從1到10
List bookList = new ArrayList();
for (int i = 1; i < 11; i++) {
bookList.add(new Book(String.valueOf(i), "book"+i));
}
return bookList;
}
public static void main(String[] args) {
List bookList = prepareData();
// 要被找出的書的ID
ArrayList ids = new ArrayList();
ids.add("3");
ids.add("6");
ids.add("8");
ids.add("9");
// 存放過濾結果的列表
List result = null;
result = ListUtils.filter(bookList, new ListUtilsHook(){
@Override
public boolean test(Book b) {
return ids.contains(b.getId());
}
});
// 打印結果列表
if (result != null && !result.isEmpty()) {
for (Book b : result) {
System.out.println(b.getId() + " " + b.getName());
}
}
}
}