Я только начал возиться с потоками 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
}
Можно еще упростить?
Я не использую Set, потому что моя реализация Device класса .equals() сравнивает все поля в этом классе. А здесь мне нужно сравнить только поле id.




Просто используйте 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));
хотя спорно, является ли это необходимым изменением. Шлейф не плохой.
"Я не использую Set, потому что моя реализация
Deviceкласса.equals()сравнивает все поля в этом классе. А здесь мне нужно сравнить только полеid." -TreeSet(Comparator<? super E>)?