当前位置: 首页 > 面试题库 >

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

沈成天
2023-03-14
问题内容

使用Java 8 Stream从Collection中查找与Property值匹配的对象。

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

人物属性->姓名,电话,电子邮件。

遍历“人员”列表并找到与对象匹配的电子邮件。看到这可以通过Java 8流轻松完成。但这仍然会返回收藏吗?

例如:

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

但是我知道它将永远只有一个唯一的对象。我们可以做些什么而不是Collectors.toList让我直接得到实际的对象。而不是获取对象列表。


问题答案:

代替使用收集器,请尝试使用findFirstfindAny

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

Optional由于列表可能不包含该对象,因此返回。

如果您确定列表中总是包含该人,则可以致电:

Person person = matchingObject.get();

不过要小心!
如果不存在任何值,则get抛出该异常NoSuchElementException。因此,我们强烈建议您先确保该值存在(或者使用isPresent或更好,使用ifPresentmaporElse或任何其他的替代品在发现Optional类)。

如果null没有这样的人,您可以参考一下,那么:

Person person = matchingObject.orElse(null);

如果可能的话,我会尽量避免使用null参考路线。在可选类(其他替代方法ifPresentmap等等)可以解决许多使用情况。我发现自己使用orElse(null)的地方只有当我拥有null在某些情况下旨在接受引用的现有代码时。

可选还有其他有用的方法。看看Optional
javadoc



 类似资料:
  • 我找到了一个解决方案,但它使用Java-8。

  • 但我知道它总会有一个独特的对象。我们是否可以做一些事情来代替,这样我可以直接获得实际的对象,而不是获取对象列表。

  • 问题内容: 我目前正在做类似物物交换系统的系统。这样的情况。客户(茉莉花)需要输入“ NAME”属性(她必须寻找的内容)并输入“ SEEK”属性(她需要寻找的内容)。为了获得结果,“ SEEK”属性必须与其他客户的“名称”属性匹配,而其他客户的“ SEEK”属性必须与Jasmine的“ HAVE”属性匹配。 例如我有表项(已经在数据库中) 例如,茉莉花具有“名称”属性的耳机和“搜索”属性的笔记本电

  • 目标 在本章节中, 我们将把calib3d模块中的特征匹配和findHomography混合在一起,以在复杂图像中找到已知对象。 基础 那么我们在上一环节上做了什么?我们使用了queryImage,找到了其中的一些特征点,我们使用了另一个trainImage,也找到了该图像中的特征,并且找到了其中的最佳匹配。简而言之,我们在另一个混乱的图像中找到了对象某些部分的位置。此信息足以在trainImag

  • 我需要根据下面的2个属性从数组中找到唯一的对象。当“类”和“票价”匹配时,我需要提取唯一的值并在结果数组中获取它们。 来源: 预期结果: 我在SO中查看并能够找到基于一个属性过滤的答案(按属性创建唯一对象数组),但无法找到基于2个属性的答案。

  • 问题内容: 我正在寻找一种非常快速,干净且有效的方法来获取以下JSON切片中的最大“ y”值: for-loop是解决此问题的唯一方法吗?我热衷于使用。 问题答案: 要在中找到对象的最大值: