在实际开发中,经常需要把一个列表中的元素,按照特定条件过滤出来,放到一个新的列表中。本文给出了几个例子,来描述解决这个问题的方法。
我们假设有一个书的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<Book> prepareData() {
// 准备书的列表,id是从1到10
List<Book> bookList = new ArrayList<Book>();
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<Book> bookList = prepareData();

// 要被找出的书的ID
ArrayList<String> ids = new ArrayList<String>();
ids.add("3");
ids.add("6");
ids.add("8");
ids.add("9");

// 存放过滤结果的列表
List<Book> 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<T> {
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 <T> List<T> filter(List<T> list, ListUtilsHook<T> hook) {
ArrayList<T> r = new ArrayList<T>();
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<Book> prepareData() {
// 准备书的列表,id是从1到10
List<Book> bookList = new ArrayList<Book>();
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<Book> bookList = prepareData();

// 要被找出的书的ID
ArrayList<String> ids = new ArrayList<String>();
ids.add("3");
ids.add("6");
ids.add("8");
ids.add("9");

// 存放过滤结果的列表
List<Book> result = null;

result = ListUtils.filter(bookList, new ListUtilsHook<Book>(){
@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());
}
}
}

}

05-18 18:25