检查 Java 中哪些参数组合为空
Check which combinations of parameters are null in Java
我是 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,但没有使代码干净。任何帮助将不胜感激
例如,您可以使用 3 位数字字符串模拟 3 个标志。
您首先将其设置为“000”。
然后检查每个变量是否为空,如果不是,则将 0 替换为 1。
然后你可以使用 switch cases 来处理每个 case。
写下这些效用函数,你可以轻松比较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
}
你做的一切都是对的,但你必须记住原始数据类型不能为空。例如 string 不是 null,而是空字符串“”,或者 int 不能为 null,它默认设置为 0。总之像 Map
, ArrayList
或 Integer
.. 你可以检查是否为空,但原始数据类型不能为空,因此您无法检查它们。要更深入地了解,只需了解原始数据类型和高级数据类型。
我希望我能解决你的问题:)
这是我的解决方案。请注意,您在一个方法中有多个 if...else
。然后添加 doSomething
。这将是可怕的准备和后来的实现。
如何将一个条件移动到单独的方法中并用相对名称命名它。然后,让我们将其封装到 Consumer
中,并将其全部封装到一个预定义的列表中。稍后,如果您的 doSomething
会很大,那么您可以从单一方法转移到单一方法 class,而不修改客户端代码。
这是class,收集条件所需的变量:
final class Data {
private final String a;
private final String b;
private final String c;
}
然后为 if
语句定义一个 Consumer
:
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
}
};
注意,所有这些消费者都可以单独修改(甚至在不同的 classes 中)。
然后在客户端代码中,定义所有已知消费者的列表:List<Consumer<Data>> consumers = Arrays.asList(wonderfulConsumer, badLuckConsumer)
.
最后你的方法就是这样,当你决定修改或添加消费者时不需要改变它。
Data data = new Data(a, b, c);
consumers.forEach(consumer -> consumer.accept(data));
如果我必须这样做,我会按照您所做的方式进行。
但是如果你不喜欢那样,并且如果你认为它不可读,你可以用这种方式来做,我希望这个答案有很多负面评论,因为这是一个糟糕的解决方案。
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,则不为空。
我是 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,但没有使代码干净。任何帮助将不胜感激
例如,您可以使用 3 位数字字符串模拟 3 个标志。 您首先将其设置为“000”。 然后检查每个变量是否为空,如果不是,则将 0 替换为 1。 然后你可以使用 switch cases 来处理每个 case。
写下这些效用函数,你可以轻松比较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
}
你做的一切都是对的,但你必须记住原始数据类型不能为空。例如 string 不是 null,而是空字符串“”,或者 int 不能为 null,它默认设置为 0。总之像 Map
, ArrayList
或 Integer
.. 你可以检查是否为空,但原始数据类型不能为空,因此您无法检查它们。要更深入地了解,只需了解原始数据类型和高级数据类型。
我希望我能解决你的问题:)
这是我的解决方案。请注意,您在一个方法中有多个 if...else
。然后添加 doSomething
。这将是可怕的准备和后来的实现。
如何将一个条件移动到单独的方法中并用相对名称命名它。然后,让我们将其封装到 Consumer
中,并将其全部封装到一个预定义的列表中。稍后,如果您的 doSomething
会很大,那么您可以从单一方法转移到单一方法 class,而不修改客户端代码。
这是class,收集条件所需的变量:
final class Data {
private final String a;
private final String b;
private final String c;
}
然后为 if
语句定义一个 Consumer
:
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
}
};
注意,所有这些消费者都可以单独修改(甚至在不同的 classes 中)。
然后在客户端代码中,定义所有已知消费者的列表:List<Consumer<Data>> consumers = Arrays.asList(wonderfulConsumer, badLuckConsumer)
.
最后你的方法就是这样,当你决定修改或添加消费者时不需要改变它。
Data data = new Data(a, b, c);
consumers.forEach(consumer -> consumer.accept(data));
如果我必须这样做,我会按照您所做的方式进行。 但是如果你不喜欢那样,并且如果你认为它不可读,你可以用这种方式来做,我希望这个答案有很多负面评论,因为这是一个糟糕的解决方案。
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,则不为空。