如何为一系列值定义一个数学函数?

jhdbpxl9  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(438)

我需要生成一个数字序列:
2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 24, 28, 32, 36, 40, 44, 48, 52, 58, 64, 70, 76, 84, 92, 100, 108, 120, 132, 144
我目前的实现非常简单:

private Set<NameValuePair> getUsersParams(int interval, int size) {
    return IntStream.iterate(interval, it -> inc(it, interval))
                    .limit(size)
                    .mapToObj(value -> new BasicNameValuePair("u", String.valueOf(value)))
                    .collect(Collectors.toSet());
}

private int inc(int value, int interval) {
    var increment = resolveIncrementFor(value, interval);
    return value + increment;
}

private int resolveIncrementFor(int value, int baseInterval) {
    if (value < 20) {
        return baseInterval;
    }
    if (value < 52) {
        return baseInterval * 2;
    }
    if (value < 76) {
        return baseInterval * 3;
    }
    if (value < 108) {
        return baseInterval * 4;
    }
    return baseInterval * 6;
}

有没有什么工具可以帮我建立一个简单的数学函数或算法(可能是递归),这将有助于避免我硬编码的值?
或者任何允许我手工定义的算法?

gzszwxb4

gzszwxb41#

如果我没听错的话,你可以用规则定义一个Map或列表。规则将由 predicate 和函数组成。类似这样的内容(尽管代码没有经过测试):

private Set<NameValuePair> getUsersParams(int interval, int size, List<Rule<Predicate<Integer>, Function<Integer,Integer>>> rules) {
    return IntStream.range(1,29)
                .map((index) -> getValue(interval, index, rules))
                .mapToObj(value -> new BasicNameValuePair("u", String.valueOf(value)))
                .collect(Collectors.toSet());
}

private int getValue(int interval, int index, List<Rule<Predicate<Integer>, Function<Integer,Integer>>> rules) {
    for (Rule<Predicate<Integer>,Function<Integer,Integer>> entry : rules) {
        if(entry.key.test(index))
            return entry.value.apply(interval);
    }
}

static class Rule<T1,T2> {
    T1 key;
    T2 value;
    Rule(T1 key, T2 value) {
        this.key = key;
        this.value = value;
    }
}

List<Rule<Predicate<Integer>, Function<Integer,Integer>>> rules = new ArrayList();  
rules.add(new Rule((input -> input < 20), (interval) -> interval));
rules.put(new Rule((input -> input < 52), (interval) -> interval * 2));
rules.add(new Rule((input -> input < 76), (interval) -> interval * 3));
rules.add(new Rule((input -> input < 108), (interval) -> interval * 4));
rules.add(new Rule((input -> input >= 108), (interval) -> interval * 6));

现在的代码仍然是相当混乱和有点多余,当谈到方法签名,但我认为你明白要点。
您可以添加新的规则,而不必接触主代码,因此它的硬编码较少,适用于不同的序列。

相关问题