2

我的 Android 应用程序中有一个方法,它采用动态设置的字体大小并返回按比例缩小的字体大小。它从 getTextSize() 获得的值用于标题,较小的值用于正文。目前它写成:

public int getSmallerTextSize(){
    int textSize = (int)Math.round(getTextSize() * 0.8);

    if(textSize > 20){
        textSize = 20;
    }else if(textSize < 10){
        textSize = 10;
    }

    return textSize;
}

我想找到一种更短、更简洁的方式来表达这一点。一种选择是:

public int getSmallerTextSize(){
    int textSize = (int)Math.round(getTextSize() * 0.8);

    textSize = textSize > 10 ? textSize : 10;
    textSize = textSize > 20 ? 20 : textSize;

    return textSize;
}

但再说一遍:这么简单的东西有很多代码。有人可以建议一个优雅的、最好是单行代码来表达这一点吗?

4

4 回答 4

10

只需使用以下表达式:

textSize = Math.min(Math.max(textSize,10),20);
于 2012-12-02T00:46:20.417 回答
4

您可以创建一个limitRange辅助方法。

public static int limitRange(int i, int min, int max) {
    if (i > max) {
        i = max;
    } else if (i < min) {
        i = min;
    }
    return i;
}

然后,当您需要限制 int 的范围时,将其用作单行:

public int getSmallerTextSize(){
    int textSize = (int)Math.round(getTextSize() * 0.8);
    textSize = limitRange(textSize, 10, 20);
    return textSize;
}
于 2012-12-02T00:35:03.850 回答
3

我更喜欢显式return的 s,并else在不必要时使用避免子句。

public int getSmallerTextSize() {
    int textSize = (int) Math.round(getTextSize() * 0.8);
    if (textSize < 10) {
        return 10;
    }
    if (textSize > 20) {
        return 20;
    }
    return textSize;
}

limitRange只有当其他方法使用相同的逻辑时,我才会提取方法。此外,添加几个保存范围限制值的常量可能会很好。

于 2012-12-02T00:39:54.070 回答
2

如果您想减少代码中的行数(单行代码) ,请尝试将两个三元运算合并到一行中,如下所示:

  int textSize = (int)Math.round(getTextSize() * 0.8);
  textSize = textSize>20 ?20:textSize<10 ?10: textSize ;
于 2012-12-02T00:38:06.970 回答