有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在获取最高值和最低值时统一代码

我的IDE给了我重复代码的警告,现在我试图找出有没有办法统一或找到这两种方法的共同抽象,这两种方法在结构上非常相似,但做的事情却相反?我自己想不出来。Thx

public double getLowestCurrencyRateInTheCurrentMonth(String baseCurrency, String targetCurrency) {
    Map<String, Map<String, Double>> rates = getAllRatesInCurrentMonth(baseCurrency);
    double lowestRate = Double.MAX_VALUE;
    for(Map<String, Double> ratesByDate : rates.values()){
        double baseCurrecyRateToTargetCurrency = ratesByDate.get(targetCurrency);
        if(baseCurrecyRateToTargetCurrency < lowestRate){
            lowestRate = baseCurrecyRateToTargetCurrency;
        }
    }
    return lowestRate;
}

public double getHighestCurrencyRateInTheCurrentMonth(String baseCurrency, String targetCurrency) {
    Map<String, Map<String, Double>> rates = getAllRatesInCurrentMonth(baseCurrency);
    double highestRate = Double.MIN_VALUE;
    for(Map<String, Double> ratesByDate : rates.values()){
        double baseCurrecyRateToTargetCurrency = ratesByDate.get(targetCurrency);
        if(baseCurrecyRateToTargetCurrency > highestRate){
            highestRate = baseCurrecyRateToTargetCurrency;
        }
    }
    return highestRate;
}

共 (3) 个答案

  1. # 1 楼答案

    我同意前面的几个答案,并且相信它们可以很好地被使用

    就我个人而言,我会创建一个统一的方法来处理公共逻辑流,然后有两个描述性方法称之为“公共逻辑方法”

    因此,我不必将布尔标志作为参数处理(在本例中为双标志),我有机会表示哪个名称最适合该方法,最后我将所有逻辑流集中在一个方法中

    示例:

    public double getLowestCurrencyRateInTheCurrentMonth(String baseCurrency, String targetCurrency) {
        return commonLogic(targetCurrency, getAllRatesInCurrentMonth(baseCurrency), Double.MAX_VALUE);
    }
    
    public double getHighestCurrencyRateInTheCurrentMonth(String baseCurrency, String targetCurrency) {
        return commonLogic(targetCurrency, getAllRatesInCurrentMonth(baseCurrency), Double.MIN_VALUE);
    }
    
    private double commonLogic(String targetCurrency, Map<String, Map<String, Double>> rates, double rate) {
        for(Map<String, Double> ratesByDate : rates.values()){
            double baseCurrecyRateToTargetCurrency = ratesByDate.get(targetCurrency);
            if(rate == Double.MIN_VALUE ? baseCurrecyRateToTargetCurrency > rate : baseCurrecyRateToTargetCurrency < rate){
                rate = baseCurrecyRateToTargetCurrency;
            }
        }
        return rate;
    }
    
  2. # 2 楼答案

    一个简单的解决方案如下: 给函数一个rate,它是double.MIN_VALUEdouble.MAX_VALUE,并将其称为rate。在函数中,您可以检查速率是double.MIN_VALUE还是double.MAX_VALUE。或者只需检查rate是更小还是更大baseCurrecyRateToTargetCurrency。我不太确定它是常数还是非常数。这将是一个例子:

    public double getCurrencyRateExtremaInTheCurrentMonth(String baseCurrency, String targetCurrency, double rate) {
        Map<String, Map<String, Double>> rates = getAllRatesInCurrentMonth(baseCurrency);
        double resultRate = rate
        for(String key : rates.keySet()){
            Map<String, Double> ratesByDate = rates.get(key);
            double baseCurrecyRateToTargetCurrency = ratesByDate.get(targetCurrency);
            if((rate == double.MIN_VALUE && baseCurrecyRateToTargetCurrency > rate) || (rate == double.MAX_VALUE && baseCurrecyRateToTargetCurrency < rate)){
                resultRate = baseCurrecyRateToTargetCurrency;
            }
        }
        return resultRate;
    }
    

    我假设baseCurrecyRateToTargetCurrency的值与在函数中以相同的方式检索的值相同。是这样吗

  3. # 3 楼答案

    在我看来,里面有很多不必要的代码。使用流可以更好地实现同样的效果。看起来是这样的:

    public double getHighestCurrencyRateInTheCurrentMonth(String baseCurrency, String targetCurrency, String variant) {
        Map<String, Map<String, Double>> rates = getAllRatesInCurrentMonth(baseCurrency);
        DoubleStream doubleStream = rates.values().stream()
                     .mapToDouble(entry -> entry.get(targetCurrency));
        OptionalDouble result = variant.equals("max") ? doubleStream.max() : doubleStream.min();
        return result.orElse(0);
    }