You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否合并类型差异较大的方法?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:00:40