2. Stream 的操作流程 (三步走)

1. 小抄

  • collect(Collectors.toList()): 最常用的终止操作。把流转回 List,而不是数组。
  • distinct(): 去重。如果流里有两个一样的字符串,去掉一个。
  • sorted(): 排序。
  • findFirst(): 只要第一个,后面的不要了。

2. 过滤处理为数组(map,filter,toArray)

String[] treeIds = strategyAwardEntities.stream() // 1. 启动传送带
        .map(StrategyAwardEntity::getRuleModel)   // 2. 加工/转换
        .filter(ruleModel -> ruleModel != null && !ruleModel.isEmpty()) // 3. 筛选/质检
        .toArray(String[]::new);                  // 4. 装箱/打包

.map(StrategyAwardEntity::getRuleModel) —— 变形/抽取

  • 动作:这是最关键的一步。map 的意思是“映射”或“转换”。
  • 比喻:传送带旁边站了一个工人,他的任务是把每个流过来的 StrategyAwardEntity 对象里的 ruleModel 属性抠出来,把剩下的扔掉。
  • 此时的状态:传送带上流动的不再是 Entity 对象了,变身成了 String 字符串(即 ruleModel 的值)。
  • 语法注StrategyAwardEntity::getRuleModel方法引用,等价于写 entity -> entity.getRuleModel()

.filter(...) —— 质检/过滤

  • 动作filter 意思是“过滤”。保留满足条件的,丢弃不满足的。
  • 逻辑ruleModel -> ruleModel != null && !ruleModel.isEmpty()
  • 比喻:质检员站在传送带旁,看到空的(null)或者长度为0的字符串,直接剔除出局。
  • 此时的状态:传送带上留下的都是有效的、有值的 ruleModel 字符串。

.toArray(String[]::new) —— 装箱/终止

  • 动作:这是终止操作。Stream 是“懒”的,如果不调用终止操作,前面的步骤都不会执行。
  • 比喻:传送带到了尽头,我们将所有剩下的优质字符串收集起来,打包装进一个新的 String 数组里。

3.根据 id 分为不同组(collect,collector,groupingBy)

List<McpGatewayToolConfigVO> toolConfigs
 
Map<Long, List<McpGatewayToolConfigVO>> toolsMap = toolConfigs.stream()
		.collect(Collectors.groupingBy(McpGatewayToolConfigVO::getToolId));
  • 取每个 McpGatewayToolConfigVO
  • 调它的 getToolId()
  • 让 toolId 一样的放到一组里