策略模式
解析代码:public class CalculateServiceImpl {
@Resource private List<CalculateHandler> handlers;
private Map<String, CalculateHandler> handlersMap;
@PostConstruct public void init() {
handlersMap = handlers.stream().collect(Collectors.toMap(CalculateHandler::getKey, Function.identity(), (v1, v2) -> v1));
}
非拉姆达写法:
handlersMap = handlers.stream()
        .collect(Collectors.toMap(
                new Function<CalculateHandler, String>() {
                    @Override
                    public String apply(CalculateHandler handler) {
                        return handler.getKey();
                    }
                },
                new Function<CalculateHandler, CalculateHandler>() {
                    @Override
                    public CalculateHandler apply(CalculateHandler handler) {
                        return handler; // Function.identity()
                    }
                },
                new BinaryOperator<CalculateHandler>() {
                    @Override
                    public CalculateHandler apply(CalculateHandler v1, CalculateHandler v2) {
                        return v1; // 冲突时保留第一个
                    }
                }
        ));
CalculateHandler 实现类注册到一个 Map 中,以便后续根据 key 快速查找对应的处理器。✅ 逐行解析
public class CalculateServiceImpl {
- 
这是一个服务实现类,可能是某个计算服务的具体实现。
 
@Resource
private List<CalculateHandler> handlers;
- 
使用
@Resource(Spring 支持的注解)注入 所有实现了CalculateHandler接口的 Bean。 - 
Spring 会自动收集容器中所有
CalculateHandler类型的 Bean,组成一个List注入进来。 - 
这是 策略模式 的典型用法:每个
CalculateHandler实现类代表一种计算策略。 
private Map<String, CalculateHandler> handlersMap;
- 
用于存储
key -> CalculateHandler的映射关系。 - 
目的是后续可以通过
key快速获取对应的处理器,避免遍历List。 
@PostConstruct
public void init() {
- 
@PostConstruct表示 在依赖注入完成后自动执行 的方法。 - 
用于初始化
handlersMap。 
handlersMap = handlers.stream()
    .collect(Collectors.toMap(
        CalculateHandler::getKey,        // key 提取器
        Function.identity(),             // value 就是 handler 本身
        (v1, v2) -> v1                   // 如果 key 重复,保留第一个
    ));
- 
将
List<CalculateHandler>转换为Map<String, CalculateHandler>。 - 
CalculateHandler::getKey:每个 handler 提供一个getKey()方法,返回其唯一标识。 - 
Function.identity():value 就是 handler 本身。 - 
(v1, v2) -> v1:如果两个 handler 的key相同,保留第一个,忽略后面的。 
✅ 总结一句话
这段代码的作用是:在 Spring 启动时,自动收集所有CalculateHandler实现类,并以getKey()的返回值为键,构建一个映射表,方便后续根据 key 快速获取对应的处理器。
✅ 举个例子
public interface CalculateHandler {
    String getKey();
    BigDecimal calculate(BigDecimal a, BigDecimal b);
}
@Component
class AddHandler implements CalculateHandler {
    public String getKey() { return "ADD"; }
    public BigDecimal calculate(BigDecimal a, BigDecimal b) { return a.add(b); }
}
@Component
class SubtractHandler implements CalculateHandler {
    public String getKey() { return "SUB"; }
    public BigDecimal calculate(BigDecimal a, BigDecimal b) { return a.subtract(b); }
}
init() 执行后:handlersMap = {
    "ADD"  -> AddHandler,
    "SUB"  -> SubtractHandler
}
✅ 后续使用示例
public BigDecimal execute(String key, BigDecimal a, BigDecimal b) {
    CalculateHandler handler = handlersMap.get(key);
    if (handler == null) throw new IllegalArgumentException("Unsupported key: " + key);
    return handler.calculate(a, b);
}
✅ 小结
| 元素 | 作用 | 
|---|---|
@Resource List<CalculateHandler> | 
收集所有策略实现 | 
@PostConstruct init() | 
初始化策略映射表 | 
Collectors.toMap(...) | 
构建 key -> handler 的映射 | 
getKey() | 
每个策略的唯一标识 | 
CalculateHandler 的源码,我可以帮你看看它的 getKey() 是怎么实现的。
                    
                
                
            
        
浙公网安备 33010602011771号