首页 > 解决方案 > 仅知道其 UUID 替换或更新列表中的对象

问题描述

我知道已经有人问过类似的问题,但每次答案都围绕“使用地图”展开。

就我而言,我必须使用列表。更准确地说,我可以使用其他数据结构进行处理,但信息最终会以List的形式存储。

情况如下:我有一个对象,我将调用它Sequence,其中包含List我将调用的对象Phase

在其他属性中,Phase对象通过ObjectId

在给定的处理期间,我必须将包含在Phase 其中的现有替换为另一个。这个的输入是替换对象和要替换的值List<Phase>SequencePhasePhaseStringObjectIdPhase

我希望能够使用 Java8 做这样的事情:

public void replacePhase(Sequence sequence, Phase replacementPhase, String idPhaseToBeReplaced) {
         List<Phase> phaseList = sequence.getPhaseslist();
         Phase phaseToBeReplaced = phaseList.stream().filter(p -> p.getId().toString().equalsIgnoreCase(idPhaseToBeReplaced)).findFirst().orElse(null);
         if (phaseToBeReplaced != null) {
             phaseToBeReplaced = replacementPhase;
         }

瞧,List<Phase>将会更新。

我知道这样的事情会起作用:

    public void replacePhase(Sequence sequence, Phase replacementPhase, String idPhaseToBeReplaced) {
             List<Phase> phaseList = sequence.getPhaseslist();
             Phase phaseToBeReplaced = phaseList.stream().filter(p -> p.getId().toString().equalsIgnoreCase(idPhaseToBeReplaced)).findFirst().orElse(null);
             if (phaseToBeReplaced != null) {
                 int i = phaseList.indexOf(phaseToBeReplaced );
                 phaseList.set(i, replacementPhase);
                 phaseToBeReplaced = replacementPhase;
             }

但是,在找到具有所需 UUID 的a时,使用带有 a 的for循环似乎并不更有效。phaseListbreakPhase

所以我的问题是:有没有一种方法,使用 List 数据结构,找到一个基于(在这种情况下是唯一的)属性的对象,然后用另一个(相同类型的)替换 List 中的所述对象,保持顺序?最好不要遍历整个列表并使用 Java8 功能?

标签: javacollectionsjava-8java-stream

解决方案


为了使您的替换功能以短路方式工作,请使用ListIterator

ListIterator<Phase> iterator = phaseList.listIterator();
while(iterator.hasNext()){
    Phase phase = iterator.next();
    if(phase.getId().toString().equalsIgnoreCase(idPhaseToBeReplaced)){ 
        iterator.set(replacementPhase);
        break;
    }
}

如果 id 不是唯一的,只需删除break. 或使用List::replaceAll.


推荐阅读