Java流过滤

时间:2017-07-11 06:59:15

标签: java list java-8 java-stream

您好我有一个已删除标志的dtos列表。我需要过滤它们并返回一个。

逻辑是如果列表中有两个项目并且其中一个项目被删除,我会获取未删除的项目,但如果只有一个项目被删除,那么我将其返回。

所以基本上没有删除订单>已删除>新项目。

List<Item> existingItems = service.getItems();
existingItems.stream().filter(e -> !e.getIsDeleted()).findAny().orElse(new Item());

如何修改此Stream管道以实现所需的逻辑?

3 个答案:

答案 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());