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

}

java的List中使用filter过滤出符合特定条件的元素List的更多相关文章

  1. C++中如何在顺序容器中删除符合特定条件的元素

    以前很少做删除操作,vector一直当成数组用,而实际追求效率时又经常舍弃vector选用C风格数组.看<C++ Primer>到顺序容器删除这节时试着实现课后习题结果一动手我就出错了. ...

  2. web应用中的Filter过滤器之基础概述

    1 过滤器概述 当web容器接收到对一个资源的请求时,它将判断是否有过滤器与这个资源相关联,如果有,那么容器将把这个请求交给过滤器进行处理.在过滤器中,你可以改变请求的内容或者重新设置请求的报头信息, ...

  3. JAVA Spring MVC中各个filter的用法

    spring mvc的org.springframework.web.filter包下的Java文件如下: 类的结构如下: AbstractRequestLoggingFilter及其子类 Abstr ...

  4. 为什么阿里巴巴Java开发手册中不允许魔法值出现在代码中?

    在阅读<阿里巴巴Java开发手册>时,发现有一条关于关于常量定义的规约,具体内容如下: 图中的反例是将数据缓存起来,并使用魔法值加链路 id 组成 key,这就可能会出现其他开发人员在复制 ...

  5. 为什么阿里巴巴Java开发手册中强制要求不要在foreach循环里进行元素的remove和add操作?

    在阅读<阿里巴巴Java开发手册>时,发现有一条关于在 foreach 循环里进行元素的 remove/add 操作的规约,具体内容如下: 错误演示 我们首先在 IDEA 中编写一个在 f ...

  6. js中filter过滤用法总结

    定义和用法 filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素. 注意: filter() 不会对空数组进行检测. 注意: filter() 不会改变原始数组 ...

  7. js--数组的filter()过滤方法的使用

    前言 你还在通过for循环遍历数组吗?你还在遍历之后一项一项的通过if判断过滤你需要的数据吗?你还在写着一大堆代码实现一个简单的过滤数据功能吗?那么,今天他来了.他就是这里要介绍的es6中数组filt ...

  8. django 模型类的常见字段约束,以及filter 过滤和查询

    null 不设置时默认设置为False.设置为True时,数据库表字段中将存入NULL的记录. null和blank组合使用,null=True,blank=True,表示该字段可以为空 blank ...

  9. C# 找出泛型集合中的满足一定条件的元素 List.Wher()

    在学习的过程中,发现泛型集合List<T>有一个Where函数可以筛选出满足一定条件的元素,结合Lambda表达式使用特别方便,写出来与大家分享. 1.关于Func<> Fun ...

随机推荐

  1. Linux命令——lspci

    参考:7 Linux lspci Command Examples to Get PCI Bus Hardware Device Info 简介 lspci可以看成“ls” + “pci”.lspci ...

  2. plsql查看是否锁表,锁模式等,以及解锁SQL

    --工作中的点滴积累SELECT l.session_id sid, s.serial#, l.locked_mode 锁模式, l.oracle_username 登录用户, l.os_user_n ...

  3. 智能驾驶数据后处理分析利器—INTEWORK-VDA

            随着智能驾驶技术在新车上逐步普及,车辆研发阶段需要做大量的实车测试工作,当前的测试方式主要是路采实车数据后,按标准和法规进行测试场景提取和测试数据分析.调查显示绝大部分智能驾驶研发厂商 ...

  4. CentOS7怎样安装Nginx1.12.2

    通过nginx官网的源码安装 yum -y install gcc* openssl* pcre* zlib* 安装相关依赖 这一步很重要 不然会报乱七八糟的错误 cd /usr/local进入/us ...

  5. mysql 5.6 rpm安装启动、配置参数、字符集修改等

    linux 7 安装mysql server 注意:此mysql版本是el6 MySQL-server-5.6.35-1.el6.x86_64 一.安装部署: 1.yum:首先要配置yum源,yum安 ...

  6. mingw控制台中文乱码

    乱码原因 直接先用一段话讲乱码原因,看不懂老老实实就往下看吧 其实我用Sublime或者VSCode等编辑器写代码出现的控制台中文乱码问题是编译器mingw输出的数据使用的是UTF-8编码,而控制台用 ...

  7. UVALive 5099 Nubulsa Expo(全局最小割)

    题面 vjudge传送门 题解 论文题 见2016绍兴一中王文涛国家队候选队员论文<浅谈无向图最小割问题的一些算法及应用>4节 全局最小割 板题 CODE 暴力O(n3)O(n^3)O(n ...

  8. Oracle 分区表中本地索引和全局索引的适用场景

    背景 分区表创建好了之后,如果需要最大化分区表的性能就需要结合索引的使用,分区表有两种索引:本地索引和全局索引.既然存在着两种的索引类型,相信存在即合理.既然存在就会有存在的原因,也就是在特定的场景中 ...

  9. Oracle plsql存储过程中out模式参数的用法

    在plsql中,存储过程中的out模式的参数可以用来返回数据,相当于函数的返回值.下面是一个小例子. 沿用上一篇的emp表结构和数据. 存储过程如下: create or replace proced ...

  10. (尚010)Vue列表的搜素和排序

    1.test010.html <!DOCTYPE html><html lang="en"><head> <meta charset=&q ...