为了账号安全,请及时绑定邮箱和手机立即绑定

替换或更新列表中仅知道其 UUID 的对象

替换或更新列表中仅知道其 UUID 的对象

一只斗牛犬 2023-10-12 17:11:26
我知道已经有人问过类似的问题,但每次答案都围绕“使用地图代替”。就我而言,我必须使用列表。更准确地说,我可以使用其他数据结构来处理,但信息最终会以List的形式存储。情况如下:我有一个我将调用的对象Sequence,其中包含List我将调用的对象Phase。除其他属性外,该Phase对象还通过以下方式获得 UUID: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时,使用 afor循环似乎并不更有效。phaseListbreakPhase所以我的问题是:有没有一种方法,使用 List 数据结构,找到基于(在本例中是唯一的)属性的对象,然后用另一个(相同类型的)替换 List 中的所述对象,同时保留顺序?最好不要迭代整个列表并使用 Java8 功能?
查看完整描述

3 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

为了使您的替换功能以短路方式工作,请使用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.


查看完整回答
反对 回复 2023-10-12
?
喵喔喔

TA贡献1735条经验 获得超5个赞

您似乎正在寻找List#replaceAll诸如:

sequence.getPhasesList()
        .replaceAll(phase -> phase.getId().toString()
                .equalsIgnoreCase(idPhaseToBeReplaced) ? replacementPhase : phase);


查看完整回答
反对 回复 2023-10-12
?
largeQ

TA贡献2039条经验 获得超7个赞

如果保持列表排序,则可以使用二分搜索找到该项目,这比迭代列表更快。

    Collections.binarySearch

如果您需要按插入顺序对其进行排序,请使用LinkedHashMap


查看完整回答
反对 回复 2023-10-12
  • 3 回答
  • 0 关注
  • 90 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信