首页 文章

Java 8 Stream API用于查找与属性值匹配的唯一对象

提问于
浏览
26

使用Java 8 Stream从集合中查找与Property值匹配的对象 .

List<Person> objects = new ArrayList<>();

人员属性 - >姓名,电话,电子邮件 .

迭代人员列表并找到匹配电子邮件的对象 . 看到这可以通过Java 8流轻松完成 . 但那仍然会收回一个集合?

例如:

List<Person> matchingObjects = objects.stream.
    filter(p -> p.email().equals("testemail")).
    collect(Collectors.toList());

但我知道它总会有一个独特的对象 . 我们可以做一些事情而不是 Collectors.toList ,以便我直接得到实际的对象 . 而不是获取对象列表 .

3 回答

  • 2

    而不是使用收集器尝试使用 findFirstfindAny .

    Optional<Person> matchingObject = objects.stream().
        filter(p -> p.email().equals("testemail")).
        findFirst();
    

    这将返回 Optional ,因为列表可能不包含该对象 .

    如果您确定该列表始终包含您可以致电的人:

    Person person = matchingObject.get();
    

    如果您不确定并且想要获得 null 如果没有这样的人,那么:

    Person person = matchingObject.orElse(null);
    

    Optionals还有其他有用的方法 . 看看Optional javadoc .

  • 56

    Guava API提供MoreCollectors.onlyElement(),这是一个收集 stream containing exactly one elementreturns that element 的收集器 .

    返回的收集器 throws 如果流 consists of two or more elements 则为 IllegalArgumentException ,如果为 stream is empty 则为 NoSuchElementException .

    请参阅以下代码以了解用法:

    import static com.google.common.collect.MoreCollectors.onlyElement;
    
    Person matchingPerson = objects.stream
                            .filter(p -> p.email().equals("testemail"))
                            .collect(onlyElement());
    
  • 1

    findAny&orElse

    使用findAny()orElse()

    Person matchingObject = objects.stream().
    filter(p -> p.email().equals("testemail")).
    findAny().orElse(null);
    

    停止寻找发生的事情 .

    findAny可选<T> findAny()返回描述流的某个元素的Optional,如果流为空,则返回空Optional . 这是一种短路终端操作 . 此操作的行为明确是不确定的;可以自由选择流中的任何元素 . 这是为了在并行操作中实现最大性能;成本是同一源上的多次调用可能不会返回相同的结果 . (如果需要稳定的结果,请改用findFirst() . )

相关问题