如何泛化仅一元运算符不同的加密解密方法?并实现流处理
密码加解密方法的泛化与流处理实现
一、泛化重复逻辑
原两个方法的核心差异仅在于对每个字符的操作:加密是字符值加1,解密是字符值减1。可以把这个字符操作抽成独立的逻辑单元,通过参数传递给一个通用方法,彻底避免代码重复。
Java里直接用内置的IntUnaryOperator函数式接口即可(char会自动转成int处理),同时把原代码中效率极低的String.concat()替换成StringBuilder(String不可变,循环拼接会生成大量临时对象):
// 通用的字符转换方法 private static String transformPassword(String input, IntUnaryOperator charOperator) { StringBuilder result = new StringBuilder(); for (char c : input.toCharArray()) { result.append((char) charOperator.applyAsInt(c)); } return result.toString(); } // 加密方法复用通用逻辑 private static String encryptPassword(String password) { return transformPassword(password, i -> i + 1); } // 解密方法复用通用逻辑 private static String decryptPassword(String encryptedPassword) { return transformPassword(encryptedPassword, i -> i - 1); }
二、用流处理替代循环
Java 8及以上的Stream API可以简化循环逻辑,直接对字符串的字符流进行链式处理:
高性能的流处理实现
private static String transformPasswordWithStream(String input, IntUnaryOperator charOperator) { return input.chars() .map(charOperator) // 对每个字符的码值应用操作 .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) .toString(); } // 加密和解密方法直接调用通用流方法 private static String encryptPassword(String password) { return transformPasswordWithStream(password, i -> i + 1); } private static String decryptPassword(String encryptedPassword) { return transformPasswordWithStream(encryptedPassword, i -> i - 1); }
流处理步骤说明
input.chars():将字符串转换为IntStream,每个元素是字符对应的ASCII/Unicode码值map(charOperator):对每个码值执行加密/解密的加减操作collect(...):直接用StringBuilder收集处理后的码值,避免生成临时String对象,性能最优
如果追求代码简洁,也可以用更直观的写法(性能略逊于上面的版本):
private static String transformPasswordWithStream(String input, IntUnaryOperator charOperator) { return input.chars() .map(charOperator) .mapToObj(c -> String.valueOf((char) c)) .collect(Collectors.joining()); }
内容的提问来源于stack exchange,提问作者Uvuvwevwevwevwe
相关产品推荐
相关产品推荐

