如何从可能是与给定 id 匹配的父级或子级之一的列表中获取对象

Posted

技术标签:

【中文标题】如何从可能是与给定 id 匹配的父级或子级之一的列表中获取对象【英文标题】:How to get an object from a list that could be a parent or one of the children that matches a given id 【发布时间】:2020-10-10 03:02:22 【问题描述】:

我有一个class A,其 id 类型为 String 和一个与父级(A 类)类型相同的子级列表,但子级可能为空,或者子级列表可能为空。给定一个 id,需要使用 java 8 流从可以与父对象 id 或子对象 id 匹配的列表中查找对象。

我有下面的代码,即使 id 与子对象匹配,它也会返回父对象。我需要子对象。

Optional<A> a = mylist.stream()
    .filter(f -> f.getId().equalsIgnoreCase(id) ||
                 f.getChildren().anyMatch(f2 -> f2.getId().equalsIgnoreCase(id)))
    .findFirst();

【问题讨论】:

【参考方案1】:

您最终在filter 中执行的操作将在父级匹配条件时返回父级,或者即使其子级之一由于|| 条件与子级中的anyMatch 匹配而返回父级.

如果您只返回对应的A 实例,则必须flatMap 所有A 对象,然后执行过滤以找到第一个匹配项。

Optional<A> firstMatch = aList.stream()
        .flatMap(a -> Stream.concat(Stream.of(a), // parent
                a.getChildren().stream().filter(Objects::nonNull))) // its non-null children
        .filter(f -> f.getId().equalsIgnoreCase(id))
        .findFirst(); // finds the corresponding instance of A and not its parent

【讨论】:

以上是关于如何从可能是与给定 id 匹配的父级或子级之一的列表中获取对象的主要内容,如果未能解决你的问题,请参考以下文章

sql查询所有父级所有子级

sql查询所有父级所有子级

sql查询所有父级所有子级

SQL Server 使用 Hierarchyid 操作层次结构数据

nhibernate - 通过更新父级或显式创建来创建子级?

Hibernate:删除未由子级引用的父级