当前位置: 首页 > 知识库问答 >
问题:

用Java Streams迭代两个相同集[重复]

东方嘉木
2023-03-14
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()));

共有1个答案

芮叶秋
2023-03-14

您的问题是没有按照预期使用optional.orelse

当您使用optional.orelse时,会急切地计算它的参数。这意味着首先搜索第二个集合,以解析第一个集合的optional.orelse的参数。

相反,使用optional.orelseget,它接收一个supplier,并对其进行延迟计算:

firstSet.stream()
    .filter(match)
    .findFirst()
    .orElseGet(() -> secondSet.stream()
        .filter(match)
        .findFirst()
        .orElseThrow(()-> new MyException()));
Stream.of(firstSet, secondSet)
    .flatMap(Set::stream)
    .filter(match)
    .findFirst()
    .orElseThrow(MyException::new);
 类似资料:
  • 我有一个Firebase数据库,在一个特定的节点级别上有日期,每个日期都有键值对,其值为一定的数字。现在我需要找到最近两天常见的数字。

  • 我有两个长度不同的< code>Vec,例如: 我想成对迭代它们,打印: 我可以使用< code>Iterator::zip来获得在< code>xs和< code>ys中具有匹配元素的对: 但是对于“不匹配”位,我需要复杂的代码来检查长度并从其余部分中提取一部分。 我想要一个完全基于迭代器的解决方案,所以我尝试了: 这是不正确的,因为第一个循环跳过了在另一个列表中没有匹配的第一个元素(x=4)。

  • 问题内容: 和 第二个代码产生了一个空指针异常,该怎么做才能使下一个等效? 问题答案: 我可以看到,如果players某个自定义java.lang.Iterable的get()实现的实现被破坏,或者至少以一种异常的方式(与的行为不同),就会发生这种情况。 除此之外,我唯一能想到的就是您未在代码中向我们展示的某些内容导致了某些错误。 如果执行此操作会怎样?

  • 我想一起迭代两个Java-8-Stream,以便在每个迭代步骤中有两个参数。类似的东西,其中生成类似的东西。 我想知道,如果Java提供了类似的东西,尽管Java中没有:-(如果没有类似的API-Function,是否还有另外一种同时迭代两个流的方法?

  • 我收到一个编译错误:

  • 我想在HashMap中搜索重复项。目前这是我的HashMap: