java-stream - 使用 Java Streams 迭代两个相同的 Set

标签 java-stream iteration java-9

<分区>

我有两个具有相同类型对象的 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()));

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

最佳答案

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

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

相反,使用 Optional.orElseGet ,它接收一个 Supplier lazily 评估:

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

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

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

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

关于java-stream - 使用 Java Streams 迭代两个相同的 Set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64250929/

相关文章:

java - 循环中的 ConcurrentModificationException

java - 如何解决 java.lang.NoClassDefFoundError : javax/xml/bind/JAXBException

java - 当 B 扩展 A 时从 List<A> 转换为 List<B>

Java 8 比较来自同一个列表的对象(数组索引越界)

python - For 循环语句评估

java - 不可变对象(immutable对象)不会使用带有模块的 Java 9 生成代码

eclipse - 如何告诉 Eclipse/Buildship/Gradle 将依赖项添加到 Modulepath

java - 可选择对流应用过滤器

java - 流和并行流

java - 了解 Java 迭代器