能否合并类型差异较大的方法?Java相似不同类型代码块能否整合?
当然可以!泛型+函数式编程搞定重复代码
你的这两个方法核心逻辑完全一致:循环读取输入,直到拿到对应类型的有效值,无效输入就跳过。唯一的区别只是类型和Scanner对应的hasNextXxx/nextXxx方法。我们可以用Java的泛型来抽象类型,再用函数式接口把不同的判断、读取逻辑传递进去,完美整合为一个通用方法。
通用方法实现
import java.util.function.Function; import java.util.function.Predicate; import java.util.Scanner; // 假设你的类里已经初始化了Scanner实例scanner public class YourClassName { private Scanner scanner = new Scanner(System.in); // 通用读取方法:泛型<T>表示要读取的目标类型 private <T> T readValue(Predicate<Scanner> hasNextChecker, Function<Scanner, T> valueReader) { T value = null; while (value == null) { if (hasNextChecker.test(scanner)) { value = valueReader.apply(scanner); } else { // 跳过不符合类型的无效输入 scanner.next(); } } return value; } // 简化后的readInteger private Integer readInteger() { return readValue(Scanner::hasNextInt, Scanner::nextInt); } // 简化后的readDouble private Double readDouble() { return readValue(Scanner::hasNextDouble, Scanner::nextDouble); } }
代码细节说明
<T>是泛型参数,用来抽象我们要读取的类型(Integer、Double都能适配),保证了类型安全。Predicate<Scanner>用来封装「判断当前输入是否符合目标类型」的逻辑,这里直接用方法引用Scanner::hasNextInt/Scanner::hasNextDouble,省去了匿名类的冗余代码。Function<Scanner, T>用来封装「读取对应类型值」的逻辑,对应Scanner的nextInt/nextDouble方法。- 核心的循环校验逻辑只写一次,以后如果要支持其他类型(比如自定义的数值类型),只需要新增一个调用
readValue的方法,传入对应的判断和读取逻辑即可,完全不用重复写循环。
内容的提问来源于stack exchange,提问作者Salar
相关产品推荐
相关产品推荐

