这是我不时使用的东西,在某些情况下,我想将其评估为不同的值,否则将评估为原始值。有时,“ a”的变量名可能很长,因此两次写起来感觉很多余,所以我想知道是否有更好的写法。例如longVariableName > 100 ? "big" : longVariableName
。
当“ a”是一个函数调用,并且您不想两次调用该函数,但是也不想将返回值保存到变量中时,也会出现这种情况。有可能吗?
当“ 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)
该函数采用值,与之比较的值以及默认值。它只对它进行一次评估,因此您得到了具有所需效果的三元组。
嗯,您可以指定一个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;
}