我的应用程序中有4个级别的类别,每个类别将包含7个子类别。所以它将是一个(7 * 7 * 7 * 7)结构。我需要在服务呼叫中获取所有四个级别的类别。我的表结构如下,
categoryId, categoryName, parentId, active
因此,对于第一级别类别,我基于其parentId为0获取其余三个类别级别,而我基于其parentId对应于categoryId。最后,我需要将所有类别的列表返回到域对象。所以我的提取代码如下,
List<DrmCategory> cate1 = categoryRepository.findByParentId(0);
cate1.forEach(category -> {
System.out.println(" Level1 -> Parent ID : "+category.getParentId()+ " Name : "+category.getCategoryName());
List<DrmCategory> cate2 = categoryRepository.findByParentId(category.getCategoryId());
cate2.forEach(category2 ->{
System.out.println(" Level2 -> Parent ID : "+category2.getParentId()+ " Name : "+category2.getCategoryName());
List<DrmCategory> cate3 = categoryRepository.findByParentId(category2.getCategoryId());
cate3.forEach(category3 -> {
System.out.println(" Level3 -> Parent ID : "+category3.getParentId()+ " Name : "+category3.getCategoryName());
List<DrmCategory> cate4 = categoryRepository.findByParentId(category3.getCategoryId());
cate4.forEach(category4 -> {
System.out.println(" Level4 -> Parent ID : "+category4.getParentId()+ " Name : "+category4.getCategoryName());
});
});
}
);
}
);
我觉得上面的代码不是实现该功能的最佳方式。任何人都可以提出一些建议来增强嵌套for循环条件。或者,如果有人建议更好的设计(表设计和嵌套循环获取所有级别类别),我将不胜感激。
答案 0 :(得分:2)
你可以试试这样的递归方法:
void recursiveMethod(int currentId, int depth) {
List<DrmCategory> cate = categoryRepository.findByParentId(currentId);
cate.forEach(category -> {
System.out.println(" Level"+depth+" -> Parent ID : "+category.getParentId()+ " Name : "+category.getCategoryName());
if (depth < 4) {
recursiveMethod(category.getCategoryId(), depth + 1);
}
});
}
要清洁,您应该根据深度调用另一种方法来管理控件。 doSomething(category, depth);
要开始递归,请致电recursiveMethod(0,1);
请注意,这是盲编码,您可能会发现语法错误。
答案 1 :(得分:0)
使用我的免费StreamEx库:
EntryStream.<DrmCategory>ofTree(null,
(depth, cat) -> depth >= 4 ? null :
categoryRepository.findByParentId(cat == null ? 0 : cat.getCategoryId()).stream())
.nonNullValues()
.mapKeyValue((depth, cat) -> " Level"+depth+" -> Parent ID : "
+ cat.getParentId() + " Name : " + cat.getCategoryName())
.forEach(System.out::println);
EntryStream.ofTree
方法能够以(depth, element)
对的形式生成平坦的深度优先的树状结构流。我们从null
元素开始作为树根(根据您的示例,似乎您没有类别ID = 0的特殊'root'元素),然后我们生成子节点流,直到深度小于4。我们使用nonNullValues()
从流中排除人工null
元素,然后使用mapKeyValue()
格式化输出字符串。