如何使用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); } }
逻辑说明
- 用
IntStream遍历列表索引,定位第一个目标ID的元素位置; - 从该位置的下一位开始,再次遍历找到下一个同ID元素的位置;
- 若两个索引都有效,就用后面的元素替换前面的过期元素,再移除后面的重复元素;
- 如果找不到下一个同ID元素,就不执行任何操作(避免索引越界或空指针)。
针对你的示例列表
原列表第一个"a"是索引0的SchedA("a",1),下一个"a"是索引3的SchedA("a",4)。执行代码后:
- 索引0的元素会被替换为
SchedA("a",4); - 索引3的
SchedA("a",4)会被移除; - 其余元素的顺序完全保留,最终列表结构符合预期。
内容的提问来源于stack exchange,提问作者KoolKeith
相关产品推荐
相关产品推荐

