You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java 8 Stream API将嵌套分类对象展平为字符串数组?

使用Java 8 Stream API展平嵌套分类对象

实现思路

核心是结合递归与flatMap遍历嵌套结构,同时维护当前节点的路径前缀,最终收集所有从根节点到叶子节点的完整路径字符串。

具体代码实现

先实现递归的Stream生成方法,负责处理单个节点及其子节点的路径拼接与展开:

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class CategoryFlattener {

    // 递归展平单个分类节点,返回路径字符串的Stream
    private static Stream<String> flattenCategory(CategoryTreeDto node, String currentPrefix) {
        // 拼接当前节点的完整路径
        String fullPath = currentPrefix.isEmpty() 
                ? node.getName() 
                : currentPrefix + "->" + node.getName();
        
        // 如果是叶子节点(无子类),直接返回当前路径的Stream
        if (node.getChildrenItems().isEmpty()) {
            return Stream.of(fullPath);
        }
        // 如果有子类,递归处理每个子类,并用flatMap合并所有子路径的Stream
        else {
            return node.getChildrenItems().stream()
                    .flatMap(childNode -> flattenCategory(childNode, fullPath));
        }
    }

    // 对外暴露的入口方法,处理分类列表
    public static List<String> flattenCategories(List<CategoryTreeDto> categoryList) {
        return categoryList.stream()
                .flatMap(rootNode -> flattenCategory(rootNode, ""))
                .collect(Collectors.toList());
    }
}

调用示例

假设你已将输入JSON反序列化为List<CategoryTreeDto>,直接调用入口方法即可得到结果:

// 假设categories是反序列化后的输入列表
List<String> categoryPaths = CategoryFlattener.flattenCategories(categories);
// 输出结果与期望一致:["Pantry->Butter->Cream", "Pantry->Snack", "Medicine"]

关键说明

  1. 路径维护:通过递归方法的currentPrefix参数传递父路径,确保子节点能拼接出完整层级路径。
  2. flatMap的作用:将每个子节点返回的Stream合并为整体Stream,实现嵌套结构的“扁平化”。
  3. 叶子节点判断:通过childrenItems.isEmpty()识别叶子节点,直接输出完整路径并终止递归。

内容的提问来源于stack exchange,提问作者Ketan Upase

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:50:39