java中表达式的别名



我在java中有一个if条件,它在代码中的许多地方重复出现。我想避免一次又一次地写出整个条件。在C中,我本可以用#define 来完成这项工作

#define cond ((i==2) && (j==5) && (k==8))
int main() {
if(cond)
}

如何在java中实现相同的功能?我可能可以创建另一种评估这种情况的方法——

main() {
if(cond())
}
cond() {
return (i==2) && (j==5) && (k==8);
}

但我想知道我是否可以避免创建另一个函数。


更新-

我意识到我应该添加更多的细节来支持我的论点。假设我有两个条件,我想检查这两个条件-

#define cond258 ((i==2) && (j==5) && (k==8))
#define cond369 ((i==3) && (j==6) && (k==9))

我可以创建2个功能-

cond258(i, j, k) {
return (i==2) && (j==5) && (k==8);
}
cond369(i, j, k) {
return (i==3) && (j==6) && (k==9);
}

对我来说,这不是一个好方法。两个函数都在做类似的事情,所以应该将它们转换为单个函数-

cond(i, j, k, first, second, third) {
return (i==first) && (j==second) && (k==third);
}

但这让我的if条件无法读取-

if(cond(i, j, k, 2, 5, 8) || cond(i, j, k, 3, 6, 9))

因此,如果我可以有一些别名,我可以简单地将其写为

if(cond258 || cond369)

我相信,如果不编写另一个函数,你就无法做到这一点,或者至少,这是不可取/不实用的。编写条件语句的另一种方法实际上是重构您的代码,在这种情况下分解条件语句。

您可以这样做。

private static int i = 2;
private static int j = 5;
private static int k = 8;
private static Supplier<Boolean> cond  = ()->i == 2 && j == 5 && k == 8;    
public static void main(String[] args) {
System.out.println(cond.get()); // prints true
k = 11;
System.out.println(cond.get()); // prints false
}
  • 我使它们成为静态的,这样它们就可以在任何上下文(静态或实例(中使用
  • 变量不能是局部的,因为lambda中的局部值必须是有效的最终值
  • 它们将与实例化包含它们的类的其他类共享

下面是一个使用实例字段的示例。

int ii = 2;
int jj = 5;
int kk = 8;
Supplier<Boolean> cond = () -> ii == 2 && jj == 5 && kk == 8;

public static void main(String[] args) {
ThisClass tc = new ThisClass();
// static context so they need to be qualified.
System.out.println(tc.cond.get()); // prints true
tc.kk = 11;
System.out.println(tc.cond.get()); // prints false
tc.foo();
}
public void foo() {
// instance method so cond and kk do not need to be qualified
kk = 8;
System.out.println(cond.get()); // true
}

这就是我解决这个问题的方法-

创建了一个新的类Triplet-

public class Triplet <F, S, T> {

public F first;
public S second;
public T third;

@Override
public boolean equals(Object obj) {
if (obj instanceof Triplet <?,?,?>) {

Triplet <?, ?, ?> triplet = (Triplet <?, ?, ?>) obj;            
return (this.first.equals(triplet.first) && this.second.equals(triplet.second) && this.third.equals(triplet.third));
} 
else 
return false;
}

public Triplet (F first, S second, T third) throws NullPointerException {
if(first==null|| second==null || third==null)
throw new NullPointerException("Can't create object with null values for first or second or third");
this.first = first;
this.second = second;
this.third = third;
}   
}

创建静态三元组-

public static final Triplet<Integer, Integer, Integer> triplet258 = new Triplet<Integer, Integer, Integer>(2, 5, 8);
public static final Triplet<Integer, Integer, Integer> triplet369 = new Triplet<Integer, Integer, Integer>(3, 6, 9);

我的if条件更改为-

Triplet<Integer, Integer, Integer> myTriplet = new Triplet<Integer, Integer, Integer>(i, j, k);
if(myTriplet.equals(triplet258) || myTriplet.equals(triplet369))

最新更新