您好我有一个已删除标志的dtos列表。我需要过滤它们并返回一个。
逻辑是如果列表中有两个项目并且其中一个项目被删除,我会获取未删除的项目,但如果只有一个项目被删除,那么我将其返回。
所以基本上没有删除订单>已删除>新项目。
List<Item> existingItems = service.getItems();
existingItems.stream().filter(e -> !e.getIsDeleted()).findAny().orElse(new Item());
如何修改此Stream
管道以实现所需的逻辑?
答案 0 :(得分:7)
您可以在List
中返回orElse
的第一个元素:
existingItems.stream()
.filter(e -> !e.getIsDeleted())
.findAny()
.orElse(existingItems.isEmpty() ? new Item() : existingItems.get(0));
答案 1 :(得分:5)
您可以通过对getIsDeleted
:
existingItems.stream()
.sorted( Comparator.comparing(Item::getIsDeleted ) )
.findFirst()
.orElseGet(Item::new);
此解决方案假定existingItems
包含少量项目。
答案 2 :(得分:4)
我加入了很晚。回答你的评论@Danjo。 使用上面的代码。
existingItems.stream().sorted(Comparator.comparing(Item::getIsDeleted)
.thenComparing(Comparator.comparing(Item::getValidFrom)))
.findFirst()
.orElse(new Item());