Как удалить элемент во время цикла по массиву - PullRequest
1 голос
/ 01 мая 2019

У меня есть объект, который содержит список других объектов, который содержит другой список объектов. Очень похоже на DTO. В этих объектах есть список объектов другого типа, в которых я хотел бы удалить этот элемент, если объект содержит определенную строку.

* 1003 Е.Г. *

CustomerDTO customerDTO = CustomerTransformer.transformCustomer(custom);
List<InfoDTO> info = customerDTO.getInfo();
info(infoDTO -> {
    List<MoreDTO> d = infoDTO.getMore();
    for (MoreDTO moreDTO : d) {
        List<ChannelDTO> channels = MoreDTO.getChannels();
        for (ChannelDTO cdto : contentChannels) {
            if ("apple".equals(cdto.getId())) {
                moreDTO.getChannels().remove(cdto);
            }
        }
    }

});

Но это действительно не кажется эффективным, и может быть возможно изменение нулевого указателя? Есть ли лучший способ написать это? И поможет ли использование потоков и фильтра в потоках?

Я новичок в Java.

Ответы [ 2 ]

3 голосов
/ 01 мая 2019

Вы не можете удалить элементы из своего списка во время итерации / зацикливания, будет ConcurrentModificationException

Так что, чтобы избежать этого, вы можете использовать Java 8 Filter здесь, таким образом -

contentChannels = contentChannels
 .stream()
 .filter(cdto->(!"apple".equals(cdto.getId())))
 .collect(Collectors.toList());

Другая опция использует removeIf()

2 голосов
/ 01 мая 2019

Приведенный выше код не будет работать, см. Комментарий @JB Nizet,

Запуск исключения ConcurrentModificationException

По сути, исключение ConcurrentModificationException используется для быстрого сбоя при изменении чего-то, что мы повторяем. Давайте докажем это с помощью простого теста:

List<Integer> integers = newArrayList(1, 2, 3);

for (Integer integer : integers) {
    integers.remove(1);
}

Так что вы можете использовать forEach и removeIf, чтобы избежать ConcurrentModificationException

List<InfoDTO> info = customerDTO.getInfo();
info.forEach(more->more.getMore().forEach(channelDto->channelDto.getChannels().removeIf(cdto->"apple".equals(cdto.getId()))));

Или, если у вас есть только List<ChannelDTO>

List<ChannelDTO> channels = MoreDTO.getChannels();
channels.removeIf(cdto->"apple".equals(cdto.getId()));
...