java stream api: поиск элемента в коллекции
Есть коллекция. Необходимо найти элемент по заданному id. Затем взять этот элемент, изменить один параметр и сохранить в БД.
В случае отсутствия такого элемента, надо создать новый объект и его сохранить в БД. Я справился только с первым пунктом, но дальше не понимаю как быть
orderItemList.stream()
.filter(p -> p.getProduct().getId().equals(orderItemDto.getProduct().getId()))
.findFirst()
.ifPresent(p -> orderItemRepository.save(p));
Если элемента нет, то:
orderItemRepository.save(new OrderItem());
Ответы (2 шт):
Автор решения: Aziz Umarov
→ Ссылка
Так попробуйте
Optional<OrderItem> orderItem = orderItemList.stream()
.filter(p -> p.getProduct().getId().equals(orderItemDto.getProduct().getId()))
.findFirst();
if (orderItem.isPresent()) {
orderItemRepository.save(orderItem.get());
} else {
orderItemRepository.save(new OrderItem());
}
Автор решения: Дмитрий
→ Ссылка
мне кажется, что все можно проще:
orderItemRepository.save(orderItemList.stream()
.filter(p -> p.getProduct().getId().equals(orderItemDto.getProduct().getId()))
.findFirst().orElse(new OrderItem()));
если нужны дополнительные манипуляции с объектом в случае, если он был найден в стриме, то можно сделать так:
orderItemRepository.save(orderItemList.stream()
.filter(p -> p.getProduct().getId().equals(orderItemDto.getProduct().getId()))
.findFirst()
.map(p -> {
p.setProductCount(p.getProductCount() + orderItemDto.getProductCount());
return p;
}).orElseGet(OrderItem::new));