You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 21:54:57