【问题标题】:Iteration of two identical Set using Java Streams [duplicate]使用 Java Streams 迭代两个相同的 Set [重复]
【发布时间】:2020-10-07 19:21:12
【问题描述】:

我有两个具有相同类型对象的 HashSet。我的搜索条件是,在第一组中搜索,如果不存在,则在另一组中搜索。我曾尝试使用 Stream 层,步骤如下所示

Set<MyObject> firstSet = new HashSet<>();
Set<MyObject> secondSet = new HashSet<>();

这两个集合有一些价值。

Predicate<MyObject> match = myObject -> StringUtils.equals(myValue, myObject.getMyValue());

firstSet.values().stream().filter(match).findFirst()
.orElse(secondSet.values().stream().filter(match)
.findFirst().orElseThrow(()-> new MyException()));

我的匹配对象在第一个集合中,我尝试手动获取它,我得到了它......但是使用上面的迭代,即使第一个集合具有匹配的对象,我也总是得到异常。请纠正我..谢谢提前。

【问题讨论】:

  • 当您将参数传递给方法时,首先评估该参数。在外部(即第一个)orElse 中,该 orElse 的参数是 secondSet.stream().values().filter(match) .findFirst().orElseThrow(()-&gt; new MyException()),它在最后三行的任何其他内容之前被评估。

标签: java-stream iteration java-9


【解决方案1】:

您的问题是您没有按预期使用Optional.orElse

当您使用Optional.orElse 时,它的参数被评估急切。这意味着首先搜索您的第二组,以解析您的第一组Optional.orElse 的参数。

改为使用Optional.orElseGet,它接收Supplier懒惰地评估

firstSet.stream()
    .filter(match)
    .findFirst()
    .orElseGet(() -> secondSet.stream()
        .filter(match)
        .findFirst()
        .orElseThrow(()-> new MyException()));

编辑:正如 Holger 在 cmets 中所建议的,有一种更简单的方法:

Stream.of(firstSet, secondSet)
    .flatMap(Set::stream)
    .filter(match)
    .findFirst()
    .orElseThrow(MyException::new);

首先流式传输集合然后调用flatMap 确保第一个集合的元素都将出现在第二个集合的元素之前。

【讨论】:

  • 谢谢你的回答...我现在就试试这个
  • 这正在工作..非常感谢..
  • Set 中没有 values() 方法。除此之外,只需Stream.concat(firstSet.stream(), secondSet.stream()) .filter(match) .findFirst() .orElseThrow(MyException::new) 就可以完成这项工作。
  • @Holger 修复了.values() 的事情,谢谢。我想在一个类似于你的代码中,如果它们是列表,我会这样做。但它们是集合。根据规范,我们是否 100% 确定,在对两个源为集合的流调用 Stream.concat 之后,第二个集合中的元素将出现在第一个集合的所有元素之后?
  • 按照所写的规范,您无法确定。所以,如果你想安全起见,你宁愿使用Stream.of(firstSet, secondSet) .flatMap(Set::stream) .filter(match) .findFirst() .orElseThrow(MyException::new),它保证按预期订购。
猜你喜欢
  • 2014-07-26
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
相关资源
最近更新 更多