zoukankan      html  css  js  c++  java
  • java的List中使用filter过滤出符合特定条件的元素List

    在实际开发中,经常需要把一个列表中的元素,按照特定条件过滤出来,放到一个新的列表中。本文给出了几个例子,来描述解决这个问题的方法。
    我们假设有一个书的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());
    }
    }
    }

    }

  • 相关阅读:
    面试
    vue axios 应用
    3D全景之ThreeJs
    css垂直居中
    事件处理过程中遇到的问题
    文字溢出
    jquery: 偏移量计算
    jquery: sand picture
    jquery: update carousel logic & animate
    jquery: carousel arrow click
  • 原文地址:https://www.cnblogs.com/Alex80/p/11251123.html
Copyright © 2011-2022 走看看