是否有更好的方式写“ a == b? c:a”?

问题描述 投票:0回答:2

这是我不时使用的东西,在某些情况下,我想将其评估为不同的值,否则将评估为原始值。有时,“ a”的变量名可能很长,因此两次写起来感觉很多余,所以我想知道是否有更好的写法。例如longVariableName > 100 ? "big" : longVariableName

当“ a”是一个函数调用,并且您不想两次调用该函数,但是也不想将返回值保存到变量中时,也会出现这种情况。有可能吗?

javascript java
2个回答
0
投票

当“ a”是一个函数调用,并且您不想两次调用该函数,但是也不想将返回值保存到变量中时,也会出现这种情况。有可能吗?

您开始考虑函数式编程。这些问题可以通过移至另一个上下文来解决。

记忆化是一种技术,或使用函数在闭包中缓存a()的结果。只要a()是纯函数并且始终返回相同的值(因此不调用系统时间...),您可以编写自己的帮助器函数来执行此操作。

这里是您的问题的最小示例:

const a = () => 5
const d = 5
const default = 6
const c = a() == d ? a() : default

所以您要避免两次调用a()。您可以这样做:

const a = () => 5

const equalsOrDefault = val => compared => default => val == compared ? val : default

const c = equalsOrDefault(a())(d)(6)

该函数采用值,与之比较的值以及默认值。它只对它进行一次评估,因此您得到了具有所需效果的三元组。


0
投票

嗯,您可以指定一个lambda,但是它取决于是否要使用它多少次。关键是,prod方法每次使用仅被调用一次。

    @FunctionalInterface
    interface TrinaryOperator<T> {
        T apply(T a, T b, T c);
    }
    public static void main(String[] args) {
        TrinaryOperator<Integer> decide = (a,b,c)-> a.equals(b) ? c : a;

        int v = decide.apply(prod(20,30), 600, 10);
        System.out.println(v);
        v = decide.apply(prod(20,30), 700, 10);
        System.out.println(v);
    }


     static int prod(int n, int s) {
         return n * s;
    }
© www.soinside.com 2019 - 2024. All rights reserved.