【问题标题】:Java streams filteringJava 流过滤
【发布时间】:2017-07-11 06:59:14
【问题描述】:

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

逻辑是,如果列表中有两项,其中一项被删除,我会获取未删除的一项,但如果只有一项并被删除,则返回它。

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

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

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

【问题讨论】:

  • 所以列表的最大大小始终为 2?
  • 不,可以下注0或更多
  • 但最大尺寸为 2?那么是 0、1 还是 2?

标签: java list java-8 java-stream


【解决方案1】:

可以在orElse中返回List的第一个元素:

existingItems.stream()
             .filter(e -> !e.getIsDeleted())
             .findAny()
             .orElse(existingItems.isEmpty() ? new Item() : existingItems.get(0));

【讨论】:

  • 如果列表为空,它将不返回任何内容,如果列表为空,我需要返回 new Item()
  • 你应该使用existingItems而不是list,只是为了清楚。
【解决方案2】:

您可以通过对getIsDeleted 进行排序来实现这一点:

existingItems.stream()
             .sorted( Comparator.comparing(Item::getIsDeleted ) )
             .findFirst()
             .orElseGet(Item::new);

此解决方案假定 existingItems 包含少量项目。

【讨论】:

  • 是否可以为 .sorted() 传递两个条件,例如:Comparator.comparing(Item::getIsDeleted) 和 Comparator.comparing(Item::getValidFrom)?
  • 不错的答案。一个小的改进是懒惰地创建Item.orElseGet(Item::new)
  • 它看起来确实很优雅,但它需要O(nlogn) 时间,而没有排序的解决方案在最坏的情况下需要线性时间。
  • @DanJo Comparator.comparing(Item::getIsDeleted).thenComparing(Item::getValidFrom)
  • 你也可以使用.stream().min(Comparator.comparing(Item::getIsDeleted))
【解决方案3】:

我加入晚了。回答您的评论@Danjo。 使用上面的代码。

existingItems.stream().sorted(Comparator.comparing(Item::getIsDeleted)
  .thenComparing(Comparator.comparing(Item::getValidFrom)))
             .findFirst()
             .orElse(new Item());

【讨论】:

  • 你确定它可以编译吗?类型推断在链式比较器中往往会失败。
  • 不,我没有机会编译代码。我认为它应该在使用方法参考时起作用。此外,比较器可以在以后显式创建和添加。请验证我的理解。
  • @shmosel:只要Item中只有一个名为getIsDeleted的方法,它就可以工作,因此Item::getIsDeleted不需要在多个方法之间进行选择。
  • 是的。我刚刚回答了@DanJo 添加的评论。是否可以为 .sorted() 传递两个条件,例如: Comparator.comparing(Item::getIsDeleted ) 和 Comparator.comparing(Item::getValidFrom)
猜你喜欢
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多