使用java8的stream()实现类似树型的加载(多用于分类表,评论表)

先看一波狗东的效果图
在这里插入图片描述
可以看出狗东的分类分为三级(实际上多少级都可以)
鄙人的数据库设计
在这里插入图片描述
如果父类的id是0的话就是最大的分类
在这里插入图片描述
然后直接说设计思路
1.先查出所有分类表的数据(直接service.list)
2.把分类表的数据根据parent_id作为一个Map的分类,大题意思就是spring,springmvc,mybatic的parent_id是0,所以他们是一组的,ioc,bean,aop的parent_id也都是1,所以他们也是同一组,只有aspect的parent_id是4,所以他也单独作为一组,当然resultMap也是单独的一组
3.把每一组里面的内容都遍历,然后如果遍历后的一列(比如spring)的id等于一组的id(相当于parent_id,因为他是根据parent_id作为分组条件的)–

通俗来说spring的child有ioc,bean,aop(aop有child(aspect))

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

直接上代码(用了mybatisblus)
实体类:

package com.lza.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
 * <p>
 * 分类
 * </p>
 *
 * @author lizhaoao
 * @since 2021-10-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="Category对象", description="分类")
//@JsonInclude(JsonInclude.Include.NON_NULL)//json上为空的直接不显示
public class Category implements Serializable {

    private static final long serialVersionUID=1L;

    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    @ApiModelProperty(value = "名称")
    private String name;

    @ApiModelProperty(value = "父级分类id")
    @JsonProperty("parent_id")//数据格式统一
    private Integer parentId;

    private Date createdAt;

    private Date updatedAt;

    private Date deletedAt;

     //孩子属性,有多个孩子
    @TableField(exist = false)//数据库没有这个字段
    private List<Category> children;
}

service层

package com.lza.service;

import com.lza.entity.Category;
import com.baomidou.mybatisplus.extension.service.IService;
import com.lza.vo.ChildCategoryVo;
import java.util.List;

/**
 * <p>
 * 分类 服务类
 * </p>
 *
 * @author lizhaoao
 * @since 2021-10-20
 */
public interface CategoryService extends IService<Category> {
    public List<ChildCategoryVo> categories();

    List<Category> AllCategories();
}

业务层:

 @Override
    public List<Category> AllCategories() {
  //查出所有分类
        List<Category> categories = baseMapper.selectList(null);
        System.out.println(categories);
        //根据parentId分组 null一组,1一组,2一组-----> 0:spring mybatis一组  1:aop ioc bean一组   4:aspect 一组 6:resultMap一组
        //设计思路 spring的id==一组id的时候===>spring的child就是该组的内容
        Map<Integer,List<Category>> collect=categories.stream().collect(Collectors.groupingBy(Category::getParentId));
        List<Category> bei=new ArrayList<>();
        System.out.println(JSON.toJSON(collect));
        collect.forEach((k,list)->{ //每组中都遍历 ------->(1,spring)(2,mybatis)
            list.forEach(b-> {//spring里面有多个键值------> b.id ,b.name,b.parentId
                bei.add(b);//把b所有内容赋值给bei先(先遍历所有出来先,因为父分类加载出来的时间字符类有可能还没有加载出来)
            });
            list=bei;
            list.forEach(c->{
                if(k.equals(c.getId())){ //如果spring里面的id等于其他分类的parentId,就可以把该分类作为spring的子分类
                    c.setChildren(collect.get(k));
                }
            });
        });
        return collect.get(0);//只返回父这个

    }

controller层

  private CategoryService categoryService;
    //显示所有分类表
    @GetMapping("/categories")
    public ResponseBean categories(){
        List<Category> list = categoryService.AllCategories();
        return ResponseBean.success(list);
    }

运行结果
在这里插入图片描述
大功告成,不过好像有个缺点,时间复杂度应该挺大的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java 8 中的 Stream API 可以使用 `map()` 和 `flatMap()` 方法来进行树型查询。 `map()` 方法可以将一个对象转换为另一个对象,而 `flatMap()` 方法则可以将一个对象转换为一个流,并将多个流合并成一个流。 例如,假设你有一个类 `Employee` 和一个类 `Department`,其中员工对象包含一个 `department` 字段,示员工所在的部门。你可以使用 `flatMap()` 方法来获取每个部门中的所有员工: ``` List<Employee> employees = ...; List<Employee> result = departments.stream() .flatMap(department -> department.getEmployees().stream()) .collect(Collectors.toList()); ``` 你也可以使用 `map()` 方法来获取员工所在部门的名称: ``` List<String> result = employees.stream() .map(employee -> employee.getDepartment().getName()) .collect(Collectors.toList()); ``` 希望这对你有帮助! ### 回答2: 在Java 8中,Stream提供了一种强大的功能来进行树型查询。树型查询是指对一棵树进行搜索、过滤和转换等操作。下面是一个简单的示例来说明如何使用Stream进行树型查询。 假设我们有一个对象类型为Node的树结构,其中每个节点包含一个值和一个子节点列。我们希望从这个树结构中查询所有符合条件的节点,并返回一个新的树结构。 首先,我们可以通过使用递归函数来遍历整个树结构。在每个节点上,我们可以通过调用Stream的filter()方法来过滤出满足条件的节点。然后,我们可以使用Stream的map()方法来对过滤出的节点进行转换,例如将节点的值进行修改。 下面是一个伪代码示例: ``` public Stream<Node> searchTree(Node currentNode) { Stream<Node> stream = Stream.of(currentNode); if (currentNode.hasChildren()) { stream = Stream.concat(stream, currentNode.getChildren().stream().flatMap(this::searchTree)); } return stream.filter(node -> node.getValue() > 10).map(node -> new Node(node.getValue() * 2)); } ``` 在这个示例中,我们创建了一个递归函数searchTree(),它接受一个当前节点作为参数。我们首先将当前节点转换为一个Stream对象,并进行过滤操作,只保留节点值大于10的节点。然后,我们将此节点的子节点列转换为一个新的Stream对象,并通过调用flatMap()方法将它们连接到当前节点的Stream对象中。最后,我们对过滤出的节点进行映射操作,将节点的值乘以2,然后创建一个新的Node对象。 通过这种方式,我们可以构建出一个新的树结构,其中只包含满足条件的节点,并对节点的值进行了修改。这种方法利用了Stream的强大功能,并且可以通过简洁的代码来实现复杂的树型查询操作。 ### 回答3: Java 8引入的Stream API为我们提供了一种便捷而强大的方式来进行树型查询操作。在树型查询中,我们可以针对一个树状结构进行查询,并根据一定的条件对节点进行过滤、排序和映射等操作。 首先,我们可以使用Stream的filter方法来筛选出符合条件的节点。例如,我们可以筛选出树中所有年龄大于18岁的节点。 然后,我们可以使用Stream的sorted方法对节点进行排序。例如,我们可以根据节点的某个属性进行排序,比如按照节点的名称按字母顺序进行排序。 接下来,我们可以使用Stream的map方法对节点进行映射。例如,我们可以将树中的每个节点的名称映射为大写形式。 此外,我们还可以使用Stream的flatMap方法对树进行扁平化处理。例如,如果树的每个节点还包含一个子树,我们可以使用flatMap方法将所有的子树合并成一个结果流。 最后,我们可以使用Stream的collect方法将查询结果收集到一个集合中。例如,我们可以将查询结果收集到一个List或者Map中,以便后续进行处理。 总结来说,Java 8的Stream API为我们提供了一种便捷而强大的方式来进行树型查询操作。我们可以使用filter、sorted、map、flatMap和collect等方法对节点进行筛选、排序、映射、扁平化和收集操作,以便对树进行灵活的操作和分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值