我是否恰当地将Java lambda用于此策略模式?

时间:2015-10-23 02:27:15

标签: java lambda

我使用lambda表达式+函数来实现策略模式,我是否正确使用它?

public void deploy(WatcherConfig config) {
    performOnWatch(config, a -> {
        deployWatch(a);
        return null;
    });
}

public void delete(final WatcherConfig config) {
    performOnWatch(config, a -> {
        deleteWatch(a);
        return null;
    });
}

public void performOnWatch(WatcherConfig config, Function<WatchConfig, Void> function) {
    for (WatchConfig watchConfig : config.getWatchConfigs()) {
        List<WatchConfig> realConfigs = WatchUtils.parseWatchParameter(watchConfig);
        for(WatchConfig realWatchConfig : realConfigs) {
            function.apply(realWatchConfig);
        }
    }
}

3 个答案:

答案 0 :(得分:5)

如果您实现performOnWatch替换streamWatchConfigs(可能会返回一个集合),则可以使用流简化getWatchConfigs方法:

public void performOnWatch(WatcherConfig config, Consumer<WatchConfig> consumer) {
    config.streamWatchConfigs()
        .flatMap(WatchUtils::parseWatchParameters)
        .forEach(consumer::accept);
}

performOnWatch(config, this::deployWatch);
performOnWatch(config, this::deleteWatch);

答案 1 :(得分:1)

似乎合法。我唯一要改变的是使用Consumer<WatchConfig>而不是Function<WatchConfig, Void>。它将简化方法签名和策略实施(策略中不需要return null)。

此外,如果deleteWatch()deployWatch()返回null,并且您将使用Consumer代码,则可以将其重写为:

performOnWatch(config, this::deployWatch);

performOnWatch(config, this::deleteWatch);

答案 2 :(得分:1)

每当你使用“模式”这个词时,你就会陷入一个可怕的心灵洞。这就是为什么我希望这本模式书从未写过。不要再考虑模式。忘了他们的名字。根据您需要完成的工作以及语言为您提供哪些工具来解决问题,并将灵活性,代码的可读性和性能结合起来。模式是精神上的拐杖。如果您足够聪明以正确使用模式,则不需要模式。如果你不是,模式会伤害你,而不是帮助你。