Заменить или обновить объект в списке, зная только его UUID - PullRequest
2 голосов
/ 09 октября 2019

Я знаю, что подобные вопросы уже задавались, но каждый раз, когда ответы вращаются вокруг "использовать карту вместо".

В моем случае, Я ДОЛЖЕН использовать Список. Точнее, я могу использовать другие структуры данных для обработки, но в конечном итоге информация будет храниться в виде списка.

Вот ситуация: у меня есть объект, который я назову Sequence,содержащий List объектов, которые я назову Phase.

Среди других свойств объекту Phase присваивается UUID через ObjectId

Во время данной обработки у меня естьзаменить существующий Phase внутри List<Phase>, содержащийся в Sequence, другим Phase. Входными данными для этого являются замена Phase объекта и String значение ObjectId Phase для замены

Я надеялся, что смогу сделать что-то подобное с помощью 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;
             }

Но это не кажется более эффективнымчто с помощью цикла for на phaseList с break при поиске Phase с желаемым UUID.

Поэтому мой вопрос: существует ли способ, используя структуру данных List, найтиобъект, основанный на (в данном случае, уникальном) свойстве, а затем заменить указанный объект внутри списка другим (того же типа), сохраняя порядок? Желательно без итерации по всему списку и использования функций Java8?

Ответы [ 3 ]

2 голосов
/ 09 октября 2019

Чтобы функция замены работала в режиме короткого замыкания, используйте ListIterator:

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

Если идентификатор не уникален, просто удалите break. Или используйте List::replaceAll.

2 голосов
/ 09 октября 2019

Вы, похоже, ищете List#replaceAll, например:

sequence.getPhasesList()
        .replaceAll(phase -> phase.getId().toString()
                .equalsIgnoreCase(idPhaseToBeReplaced) ? replacementPhase : phase);
1 голос
/ 09 октября 2019

Если вы сохраняете список отсортированным, вы можете найти элемент с помощью бинарного поиска, что будет быстрее, чем итерация списка.

    Collections.binarySearch

Если вам нужно сохранить сортировку по порядку вставки, используйте LinkedHashMap

...