检查Java中哪些参数组合为空

问题描述 投票:5回答:5

我是Java新手。我现在面临一个问题,我无法找到最简单,最干净的解决方法。

假设我有3个参数(字符串)传递给一个函数(也可能是一个Hashmap)。我想检查单个变量或变量组合是否不是Null并相应地采取行动。

例如,一种方法是使用if-else这种方式

if(a!=null && b == null && c == null) { 
      //doSomething   
}
 else if(a==null && b!= null && c == null ) { 
     //doSomething 
}
 else if(a==null && b0= null && c != null) { 
     //doSomething 
}
  ......
    //Similarly combination of two variables
 if(a!=null && b != null && c == null) {
     //doSomething 
}
 else if(a!=null && b== null && c != null) { 
    //doSomething
}
 else if(a==null && b!= null && c != null) { 
    //doSomething 
} 
  ......
    //and so on 
    //Similarly combination of three variables
 if(a!=null && b != null && c != null) {
    //doSomething 
}

   ....

如何实现这种情况。我发现了类似的question,但没有使代码干净。任何帮助将不胜感激

java if-statement conditional
5个回答
7
投票

编写这些实用程序功能,您可以轻松地比较n个术语。

public static boolean areAllNull(Object... objects) {
     return Stream.of(objects).allMatch(Objects::isNull);
}

public static boolean areAllNotNull(Object... objects) {
     return Stream.of(objects).allMatch(Objects::nonNull);
}

你可以使用这些函数进行n次比较。

if(areAllNotNull(a) && areAllNull(b,c)) { 
      //doSomething   
}
 else if(areAllNotNull(b) && areAllNull(a,c)) { 
     //doSomething 
}
 else if(areAllNotNull(c) && areAllNull(b,a)) { 
     //doSomething 
}

2
投票

这是我的解决方案。请注意,您在一个方法中有多个if...else。然后你添加doSomething。准备好后来意识到这将是非常可怕的。

如何将单个条件移动到单独的方法中并使用相对名称命名。然后,让我们将它封装到Consumer中,并将其全部封装到预定义的列表中。之后,如果您的doSomething将是巨大的,那么您可以从单个方法转移到单个类,而不是修改客户端代码。

这是类,用于收集条件所需的变量:

final class Data {

    private final String a;
    private final String b;
    private final String c;
}

然后在Consumer声明中定义一个if

Consumer<Data> wonderfulConsumer = data -> {
    if (a != null && b == null && c == null) {
        // do something for wonderful consumer
    }
};

Consumer<Data> badLuckConsumer = data -> {
    if (a == null && b != null && c == null) {
        // do something for bad luck consumer
    }
};

请注意,所有这些消费者都可以单独修改(甚至可以在不同的类中)。

然后在客户端代码中,定义所有已知消费者的列表:List<Consumer<Data>> consumers = Arrays.asList(wonderfulConsumer, badLuckConsumer)

最后,您的方法将是这样的,当您决定修改或添加消费者时,您不需要更改它。

Data data = new Data(a, b, c);
consumers.forEach(consumer -> consumer.accept(data));

0
投票

如果我必须这样做,我将以你做过的方式做到这一点。但如果你不喜欢这样,如果你认为它不可读,你可以这样做,我期待很多负面评论这个答案,因为这是一个糟糕的解决方案。

 public static void yourMethod(Object a,Object b,Object c)
  {
    int evaluation = howManyNotNull(a,b,c);

    if(evaluation == 0) // all are nulls
    {
      // your code
    }
    else if(evaluation == 1) // only one is not null
    {
      if(a!=null)
      {

      }
      else if(b!=null)
      {

      }
      else
      {
        // c not null
      }
    }
    else if(evaluation == 2) // two variables are not null but other one is null
    {
      if(a==null)
      {

      }
      else if(b == null)
      {

      }
      else
      {
        // c is null, a and b not null
      }
    }
    else 
    {
      // all abc not null
    }

  }

  private static int howManyNotNull(Object a, Object b, Object c)
  {
    return (a==null?0:1) + (b==null?0:1) + (c==null?0:1);
  }

有扩展版本,为a,b,c分配3个素数值(例如:a = 2,b = 3,c = 5),然后使用这样的支持方法

private static int convertAvailabilityToInt(Object a, Object b, Object c)
  {
    return (a==null?1:2) * (b==null?1:3) * (c==null?1:5);
  }

如果答案是1,则所有都不为空。


-1
投票

您可以使用例如模拟3个标志的3位数字符串。首先将其设置为“000”。然后检查每个变量是否为null,如果不是,则将0替换为0.然后,您可以使用switch case来处理每个案例。


-2
投票

您正在做的一切正确,但您必须记住原始数据类型不能为空。例如,string不为null,但是空字符串“”或int不能为null,默认设置为0.总结对象如MapArrayListInteger ..您可以检查null,但原始数据类型不能为null ,所以你无法检查它们。为了更深入地理解,只需了解原始和高级数据类型。我希望我的问题正确:)

© www.soinside.com 2019 - 2024. All rights reserved.