Добавить объект X в коллекцию, только если коллекция не содержит объекта с одним подходящим свойством - PullRequest
0 голосов
/ 02 марта 2019

Я только начал возиться с потоками Java и написал что-то вроде этого:

List<Device> devicesToDelete = new ArrayList<>();
List<Device> oldDeviceList = getCurrentDevices();

for (Device deviceFromOldList : oldDeviceList)
{
    // part to simplify

    boolean deviceNotExistOnDeleteList =
        devicesToDelete.stream().noneMatch(nd -> nd.id == deviceFromOldList.id);

    if (deviceNotExistOnDeleteList) {
        devicesToDelete.add(deviceFromOldList);
    }

    // part to simplify end
}

Можно ли это еще больше упростить?

Iя не использую Set, потому что моя реализация Device class .equals() сравнивает все поля в этом классе.И тут мне нужно сравнить только id поле.

1 Ответ

0 голосов
/ 05 марта 2019

Просто используйте Map

Map<Object, Device> devicesToDelete = new HashMap<>();
List<Device> oldDeviceList = getCurrentDevices();

for(Device deviceFromOldList: oldDeviceList) {
    devicesToDelete.putIfAbsent(deviceFromOldList.id, deviceFromOldList);
}

// in case you need a Collection:
Collection<Device> allDevicesToDelete = devicesToDelete.values();

putIfAbsent, чтобы сохранить отображение, только если ключ еще не присутствует.Это даст вам производительность хеширования, учитывая только идентификатор.

Вы можете изменить аргумент типа Object в Map<Object,Device> на любой тип, который имеет ваш идентификатор, хотя это не имеет значения для операции,если все, что вам нужно в конце, это Collection<Device>.

. Вы можете использовать поток, например,

Map<Object, Device> devicesToDelete = getCurrentDevices().stream()
    .collect(Collectors.toMap(
        deviceFromOldList -> deviceFromOldList.id, Function.identity(), (a,b) -> a));

, однако, остается спорным, является ли это необходимым изменением.Цикл неплохой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...