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 一样的放到一组里