如何用Stream过滤包含DENIED枚举Action的Request列表
使用Java Stream过滤包含DENIED动作的Request对象
需求概述
需要从Request对象列表中移除所有包含状态为DENIED的Action的Request对象,用Java Stream实现更简洁高效的方案。
数据结构回顾
public class Request{ private int id; private List<Action> actions; public List<Action> getActions(){ return actions; } } public class Action{ private int id; private String comment; private ActionEnum actionEnum; public ActionEnum getAction(){ return actionEnum; } } public enum ActionEnum { ACCEPTED, DENIED, OPEN }
优化后的Stream实现方案
import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class StackOverflow { public static void main(String[] args) { List<Request> allRequests = new ArrayList<>(); // 过滤出不包含任何DENIED动作的Request List<Request> result = allRequests.stream() .filter(request -> request.getActions().stream() .noneMatch(action -> ActionEnum.DENIED.equals(action.getAction()))) .collect(Collectors.toList()); System.out.println(result); } }
代码解释
stream():将原列表转为Stream流,开启流式操作filter():核心过滤逻辑,只保留满足条件的Request- 内层
request.getActions().stream():将当前Request的Action列表转为Stream noneMatch(...):判断当前Request的所有Action中没有状态为DENIED的,符合该条件的Request会被保留
- 内层
collect(Collectors.toList()):将过滤后的Stream结果收集为新的List对象
原方案的问题
原方案通过遍历原列表并从拷贝列表中移除元素,存在以下不足:
- 效率偏低:每次调用
result.remove(request)会触发ArrayList的元素移位操作,数据量大时性能损耗明显 - 可读性差:嵌套循环+条件移除的逻辑不够直观,后续维护成本高
- 潜在风险:若原列表在遍历过程中被修改,可能触发并发修改异常(示例为单线程场景,风险较低)
内容的提问来源于stack exchange,提问作者Lukas Wenzel
相关产品推荐
相关产品推荐

