改造前的代码
public class CacheService {
@Autowired
private RedisConfig redisConfig;
@Override
public Result<Void> sadd(String cacheKey, String member) {
RedisPool redisPool = redisConfig.getRedisPool();
try (Redis redis = redisPool.getResource()) {
redis.sadd(cacheKey, member);
return Result.isOk(null);
} catch (Exception e) {
LoggerUtil.error(e,
String.format("sadd=%s, cacheKey=%s, member=%s", e.getMessage(), cacheKey, member));
return Result.onError(Constants.ErrorCodes.E_1005.getCode(), e.getMessage());
}
}
@Override
public Result<Boolean> sismember(String cacheKey, String member) {
RedisPool redisPool = redisConfig.getRedisPool();
try (Redis redis = redisPool.getResource()) {
return Result.isOk(redis.sismember(cacheKey, member));
} catch (Exception e) {
LoggerUtil.error(e,
String.format("sismember异常=%s, cacheKey=%s, member=%s", e.getMessage(), cacheKey, member));
return Result.onError(Constants.ErrorCodes.E_1005.getCode(), e.getMessage());
}
}
}
观察旧代码,发现每个方法只有调用redis函数、和异常打印不同,其余地方都一样,所以可以通过以下调整,进行代码简化
- 由于
调用redis函数的返回值,会成为方法的返回值的一部分,且返回值的数据类型不一定,所以可以用既有入参、又有出参(泛型)的函数模版Function<Redis, R>来封装调用redis函数的不同 - 异常日志打印只有入参、没有出参,所以可以用Consumer< Exception >来封装
日志打印的不同
改造后的代码
public class CacheService {
@Autowired
private RedisConfig redisConfig;
@Override
public Result<Void> sadd(String cacheKey, String member) {\
return getResult(redis -> {
redis.sadd(cacheKey, member);
return null;
},
e -> LoggerUtil.error(e,
String.format("sadd=%s, cacheKey=%s, member=%s", e.getMessage(), cacheKey, member)));
}
@Override
public Result<Boolean> sismember(String cacheKey, String member) {
return getResult(redis -> redis.sismember(cacheKey, member),
e -> LoggerUtil.error(e,
String.format("sismember异常=%s, cacheKey=%s, member=%s", e.getMessage(), cacheKey, member)));
}
@NotNull
private <R> Result<R> getResult(Function<Redis, R> function, Consumer<Exception> consumer) {
RedisPool redisPool = redisConfig.getRedisPool();
try (Redis redis = redisPool.getResource()) {
return Result.isOk(function.apply(redis));
} catch (Exception e) {
consumer.accept(e);
return Result.onError(e.getMessage());
}
}
}

本文介绍了如何通过泛型和函数式编程重构Java代码,以减少重复并提高可读性。示例展示了如何将`sadd`和`sismember`方法统一处理,利用`Function`和`Consumer`接口实现通用的错误处理和Redis操作。
920

被折叠的 条评论
为什么被折叠?



