【101】java的List中使用filter过滤出符合特定条件的元素List

在实际开发中,常常须要把一个列表中的元素,按照特定条件过滤出来,放到一个新的列表中。本文给出了几个例子,来描述解决这个问题的方法。
咱们假设有一个书的List,须要找出其中id分别是三、六、八、9的书。本文介绍了两种方法来完成这个工做。第一种方法是使用java8支持的lambda表达式,代码简洁可是仅能用在java8版本上。第二种方法使用了传统的方式,能够用在java的旧版本上。java

书的实体类:web

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表达式:ide

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这个工具类:svg

接口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;
    }
}

使用方式:this

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());
            }
        }
    }

}