有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

变量如何打开equals语句以接受Java中的多个参数?

我有一个梦想

在这个梦中,我可以替换这样的结构:

if(aLongVariableName.equals(classInstance.aPropertyOfThatInstance) ||  
   aLongVariableName.equals(classInstance.aDifferentProperty)){  
    ...  
}

if(aLongVariableName.equals(classInstance.aDifferentProperty || aPropertyOfThatInstance)){ 
   ...  
}

我认为后者更简洁,更容易阅读。我确信有些事情应该是可能的,因为方法可以用这种签名public void readUnlimitedVariables(Variable ... vars)声明,它使用逗号分隔变量(与||甚至&&相反)

这可以打开任何返回布尔值的对象,例如:

if(myLovelyInstance instanceof AwesomeClass && EpicClass){
    ...
}

其中myLovelyInstance实现AwesomeClass && EpicClass

这在Java中可能吗?到目前为止,我还没有通过谷歌搜索或其他方式找到任何相关信息。如果不是在vanilla Java中,是否有任何第三方软件包(如Lombok或lambdaJ)允许这样做?如果不是,这是否是任何语言的特征?这对我来说似乎很直观,但我在任何地方都没见过


共 (2) 个答案

  1. # 1 楼答案

    你能考虑一个坏习惯吗?(我对Java还比较陌生,所以我可能会发明轮子,或者只是做些牛屎*t:)

    public class Main {
        public static <Type> boolean equalsVariadicOr(Type toComp, Type ... args) {
                    for (Type arg : args) {
                            if (toComp.equals(arg)) {
                                    return true;
                            }
                    }
                    return false;
            }
    
            public static <Type> boolean equalsVariadicAnd(Type toComp, Type ... args) {
                    for (Type arg : args) {
                            if (!toComp.equals(arg)) {
                                    return false;
                            }
                    }
                    return true;
            }
    
            public static void main(String args[]) {
                    String testcaseAllA[]  = new String[] {"a", "a", "a", "a", "a", "a", "a", "a", "a", "a"};
                    String testcaseWithB[] = new String[] {"b", "a", "a", "a", "a", "a", "a", "a", "a", "a"};
                    System.out.println(equalsVariadicAnd("a", testcaseAllA));
                    System.out.println(equalsVariadicAnd("b", testcaseWithB));
                    System.out.println(equalsVariadicOr("b", testcaseWithB));
                    System.out.println(equalsVariadicOr("a", testcaseAllA));
            }
    }
    

    如果答案是否定的,也许OP会发现这很有用

  2. # 2 楼答案

    您可以使用varargs和Lombok的扩展方法获得非常类似的结果:

    1. 在实用程序类中定义以下静态方法:

      package test;
      
      public final class Util {
          private Util() {}
      
          public static boolean eqOr(Object tthis, Object ... those) {
              for (Object that : those) {
                  if (tthis.equals(that)) return true;
              }
              return false;
          }
      
          public static boolean eqAnd(Object tthis, Object ... those) {
              for (Object that : those) {
                  if (!tthis.equals(that)) return false;
              }
              return true;
          }
      }
      
    2. 使用Lombok使eqAndeqOr成为扩展方法:

      package test;
      
      @lombok.experimental.ExtensionMethod({test.Util.class})
      public class Work {
        public static void main(String[] args) {
          System.out.println("a".eqOr("b", "c", "a"));
          System.out.println("a".eqOr("b", "c"));
          System.out.println("a".eqAnd("a", "a", "a"));
          System.out.println("a".eqAnd("a", "a", "c"));
        }
      }
      

      显然,如果你不喜欢lombok,你可以像使用常规静态方法一样使用它们