如何从可能是与给定 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 Server 使用 Hierarchyid 操作层次结构数据