如何在Drools规则中扁平化嵌套列表结构的对象集合得到一维列表
解决方案
方法1:直接生成扁平化一维列表(推荐)
你之前的写法是将每个TopObject对应的二级列表作为单个元素存入结果,所以会得到嵌套结构。可以通过多层from嵌套遍历直接收集所有二级对象,无需先汇总TopObject列表:
$SecondLevelObjects: List() from accumulate( $obj: SecondLevelObject() from $topObj.ListOfSecondLevelObjects from TopObject() from $MainFact.ListOfTopObjects; collectList($obj) )
该写法会直接遍历到最底层的SecondLevelObject再做汇总,最终得到的就是无嵌套的一维列表。
方法2:对已有的二维嵌套列表做扁平化
如果已经生成了二维嵌套列表,可以直接用Java Stream API处理,规则的RHS部分写法如下:
// 假设已拿到二维列表变量$nestedList List<SecondLevelObject> flattenedList = (List<SecondLevelObject>) $nestedList.stream() .flatMap(subList -> ((List<SecondLevelObject>) subList).stream()) .collect(Collectors.toList());
该方法适用于Java 8及以上的运行环境,无需额外引入依赖。
内容的提问来源于stack exchange,提问作者Brischki
相关产品推荐
相关产品推荐

