首页 > Java教程 > Java集合、泛型和枚举
使用Java 8新增的Predicate操作Collection集合
Java 8 起为 Collection 集合新增了一个 removeIf(Predicate filter) 方法,该方法将会批量删除符合 filter 条件的所有元素。该方法需要一个 Predicate 对象作为参数,Predicate 也是函数式接口,因此可使用 Lambda 表达式作为参数。
如下程序示范了使用 Predicate 来过滤集合。
此处只是一个假设,实际上还可能有更多的统计需求。如果采用传统的编程方式来完成这些需求,则需要执行三次循环,但采用 Predicate 只需要一个方法即可。下面代码示范了这种用法。
如下程序示范了使用 Predicate 来过滤集合。
public class ForeachTest { public static void main(String[] args) { // 创建一个集合 Collection objs = new HashSet(); objs.add(new String("新宝库Java教程")); objs.add(new String("新宝库C++教程")); objs.add(new String("新宝库C语言教程")); objs.add(new String("新宝库Python教程")); objs.add(new String("新宝库Go教程")); // 使用Lambda表达式(目标类型是Predicate)过滤集合 objs.removeIf(ele -> ((String) ele).length() < 12); System.out.println(objs); } }上面程序中第 11 行代码调用了 Collection 集合的 removeIf() 方法批量删除集合中符合条件的元素,程序传入一个 Lambda 表达式作为过滤条件。所有长度小于 12 的字符串元素都会被删除。编译、运行这段代码,可以看到如下输出:
[新宝库Java教程, 新宝库Python教程]
使用 Predicate 可以充分简化集合的运算,假设依然有上面程序所示的 objs 集合,如果程序有如下三个统计需求:- 统计集合中出现“新宝库”字符串的数量。
- 统计集合中出现“Java”字符串的数量。
- 统计集合中出现字符串长度大于 12 的数量。
此处只是一个假设,实际上还可能有更多的统计需求。如果采用传统的编程方式来完成这些需求,则需要执行三次循环,但采用 Predicate 只需要一个方法即可。下面代码示范了这种用法。
public class ForeachTest2 { public static void main(String[] args) { // 创建一个集合 Collection objs = new HashSet(); objs.add(new String("新宝库Java教程")); objs.add(new String("新宝库C++教程")); objs.add(new String("新宝库C语言教程")); objs.add(new String("新宝库Python教程")); objs.add(new String("新宝库Go教程")); // 统计集合中出现“新宝库”字符串的数量 System.out.println(calAll(objs, ele -> ((String) ele).contains("新宝库"))); // 统计集合中出现“Java”字符串的数量 System.out.println(calAll(objs, ele -> ((String) ele).contains("Java"))); // 统计集合中出现字符串长度大于 12 的数量 System.out.println(calAll(objs, ele -> ((String) ele).length() > 12)); } public static int calAll(Collection books, Predicate p) { int total = 0; for (Object obj : books) { // 使用Predicate的test()方法判断该对象是否满足Predicate指定的条件 if (p.test(obj)) { total++; } } return total; } }输出结果为:
5 1 1
上面程序先定义了一个 calAll() 方法,它使用 Predicate 判断每个集合元素是否符合特定条件,条件将通过 Predicate 参数动态传入。从上面程序中第 11、13、15 行代码可以看到,程序传入了 3 个 Lambda 表达式,其目标类型都是 Predicate,这样 calAll() 方法就只会统计满足 Predicate 条件的图书。所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算