需要在Java

时间:2015-12-16 16:12:40

标签: java for-loop java-8 spring-data spring-data-jpa

我的应用程序中有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循环条件。或者,如果有人建议更好的设计(表设计和嵌套循环获取所有级别类别),我将不胜感激。

2 个答案:

答案 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()格式化输出字符串。