我正在创建一个搜索以从100到600过滤一些Integer值。这些值为Http Status Codes,所以我只想过滤它们。
搜索的工作方式如下:


用户输入搜索值,例如2,点击搜索
结果将是从200到299的所有值(因此所有值均以2开头)。
用户输入一个值,例如20,然后点击搜索
结果将是200到209之间的所有值(因此所有
值以20开头)。
用户输入一个值,例如52,然后点击搜索
结果将是从520到529的所有值(因此所有
值以52开头)


我写了一些非常多余的代码,但基本上解释了它应该如何工作:

     public void getHttpStatus(Integer httpStatus){
            if(httpStatus.equals(1)){
                messageRepository.findByHttpStatusBetween(100, 199);
            }
            else if(httpStatus.equals(2)){
                messageRepository.findByHttpStatusBetween(200, 299);
            }
            else if(httpStatus.equals(3)){
                messageRepository.findByHttpStatusBetween(300, 399);
            }
            else if(httpStatus.equals(4)){
                messageRepository.findByHttpStatusBetween(400, 499);
            }
            else if(httpStatus.equals(5)){
                messageRepository.findByHttpStatusBetween(500, 599);
            }
            else if(httpStatus.equals(10)){
                messageRepository.findByHttpStatusBetween(100, 109);
            }
            else if(httpStatus.equals(20)){
                messageRepository.findByHttpStatusBetween(200, 209);
            }
            else if(httpStatus.equals(30)){
                messageRepository.findByHttpStatusBetween(300, 309);
            }
            else if(httpStatus.equals(40)){
                messageRepository.findByHttpStatusBetween(400, 409);
            }
            else if(httpStatus.equals(50)){
                messageRepository.findByHttpStatusBetween(500, 509);
            }
            else if(httpStatus.equals(21)){
                messageRepository.findByHttpStatusBetween(210, 219);
            }
            ...
        }


有没有更简单的方法可以做到这一点?还是有任何自动执行此操作的内置spring方法?

我将不胜感激任何建议。

最佳答案

public class Range {
    public int lb;
    public int ub;

    public Range(int lb, int ub) {
        this.lb = lb;
        this.ub = ub;
    }

    public Range(int statusCode) {
        int length = (int) (Math.log10(statusCode) + 1);
        if (length == 0 || length > 2) {
            throw new RuntimeException("Cant parse status code of invald length: " + length);
        }
        if (length == 1) {
            this.lb = statusCode * 100;
            this.ub = ((statusCode + 1) * 100) - 1;
        } else {
            this.lb = statusCode * 10;
            this.ub = ((statusCode + 1) * 10) - 1;
        }
    }
}


public class Main {
    public static void main(String[] args) {
        Range r1 = new Range(52);
        Range r2 = new Range(2);
        Range r3 = new Range(20);
        System.out.println("Lowerbound: " + r1.lb);
        System.out.println("Upperbound: " + r1.ub);
        System.out.println("Lowerbound: " + r2.lb);
        System.out.println("Upperbound: " + r2.ub);
        System.out.println("Lowerbound: " + r3.lb);
        System.out.println("Upperbound: " + r3.ub);
    }
}


输出如下:

Lowerbound: 520
Upperbound: 529
Lowerbound: 200
Upperbound: 299
Lowerbound: 200
Upperbound: 209


不检查特殊值0。

然后可以将您的函数重构为:

public void getHttpStatus(Integer httpStatus){
        Range r = new Range(httpStatus.intValue());
        messageRepository.findByHttpStatusBetween(r.lb, r.ub);
}

09-25 18:45