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

如何使用Java Stream将首个符合条件的元素替换为下一同条件元素

替换过期调度的实现方案

要实现用下一个同ID调度替换过期调度并维持列表顺序,仅靠简单的stream().findFirst().ifPresent()做不到——这个逻辑需要定位两个关键元素(第一个过期的目标调度、它之后的第一个同ID调度),还要基于索引修改原列表。下面是直接可行的实现方式:

代码实现

String targetId = "a"; // 要处理的调度ID

// 1. 找到第一个目标调度的索引
int firstTargetIdx = IntStream.range(0, scheduleList.size())
        .filter(idx -> targetId.equals(scheduleList.get(idx).getScheduleId()))
        .findFirst()
        .orElse(-1);

if (firstTargetIdx != -1) {
    // 2. 找到第一个目标索引之后,下一个同ID调度的索引
    int nextTargetIdx = IntStream.range(firstTargetIdx + 1, scheduleList.size())
            .filter(idx -> targetId.equals(scheduleList.get(idx).getScheduleId()))
            .findFirst()
            .orElse(-1);

    if (nextTargetIdx != -1) {
        // 3. 替换第一个过期调度为下一个同ID调度
        scheduleList.set(firstTargetIdx, scheduleList.get(nextTargetIdx));
        // 4. 移除被用来替换的调度(避免重复)
        scheduleList.remove(nextTargetIdx);
    }
}

逻辑说明

  1. 用IntStream遍历列表索引,定位第一个目标ID的元素位置;
  2. 从该位置的下一位开始,再次遍历找到下一个同ID元素的位置;
  3. 若两个索引都有效,就用后面的元素替换前面的过期元素,再移除后面的重复元素;
  4. 如果找不到下一个同ID元素,就不执行任何操作(避免索引越界或空指针)。

针对你的示例列表

原列表第一个"a"是索引0的SchedA("a",1),下一个"a"是索引3的SchedA("a",4)。执行代码后:

  • 索引0的元素会被替换为SchedA("a",4);
  • 索引3的SchedA("a",4)会被移除;
  • 其余元素的顺序完全保留,最终列表结构符合预期。

内容的提问来源于stack exchange,提问作者KoolKeith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:22:37