【问题标题】:Finding failed condition from an if statement (which has multiple condition of AND type) in java从java中的if语句(具有多个AND类型的条件)中查找失败的条件
【发布时间】:2020-04-26 14:27:24
【问题描述】:

我正在努力研究 Java 中的 if 语句。它是这样的。假设 if 语句中有多个条件与 AND 运算符连接,并且由于其中一个条件失败而导致条件失败。然而,很难找到哪个条件失败了,因为整个场景都失败了。我想知道是否有一些操作或逻辑,我们可以从中识别导致失败的条件。

注意:嵌套 if 可以,但不太可行,所以想从社区获得一些意见。提前致谢。

if (!(employee.validateemployee(employee) && employee.Validateweb(message))) {  

    log.info(" Mandatory Validation Failed !!");
    validationHelper.DBinsert(exchange, message);                                   
}

【问题讨论】:

标签: java if-statement


【解决方案1】:

不优雅,但如果您真的需要失败条件的索引,您可以使用流执行以下操作:

Stream<Boolean> myBools = Stream.of(true,false,true,true);           
int failedAt = myBools.takeWhile(Boolean::booleanValue).collect(Collectors.toList()).size() + 1;
System.out.println("Failed at position " + failedAt);

你的情况

if (!(employee.validateemployee(employee) && employee.Validateweb(message))) {  
   int failedAt = Stream.of(employee.validateemployee(employee), employee.Validateweb(message))
                        .takeWhile(Boolean::booleanValue)
                        .collect(Collectors.toList())
                        .size() + 1;
   log.info(" Mandatory Validation Failed !! at position: " + failedAt );
   validationHelper.DBinsert(exchange, message);                                   
}

【讨论】:

  • 我再次遇到了@Eritrean 这种方法的问题。使用这种方法会显示错误。它指出无法在此位置使用 takeWhile。你能帮帮我吗?
  • 我还了解到 takeWhile 是 Java 9 的一种用法,而我现在使用的是 Java 8。
【解决方案2】:

如果知道对你的代码很重要

  if (A && B) …  

无论 A 或 B 是否为假(或两者兼有),那么简单的方法就是不要那样写。改为这样写:

  if (!A) …   
  else if (!B) …  
  else // A and B are true  

如果您有很多用于 !A 和 !B 情况的代码,太多而无法复制,则将其抽象为可以从这两个地方调用的方法。

或者,在某些情况下,您可能想写:

 if (A && B) … expected …  
 else if (A) … B was false …  
 else … A was false …

一种我一般不喜欢但有时是最简单的解决方案的方法(例如,如果计算 A 两次很昂贵):

boolean tmp;
if ((tmp = A) && B) …  
else if (tmp) … B was false …  
else … A was false …  

最后当然总是有

boolean isA = A;
if (isA && B) …  
else if (isA) … B was false …  
else … A was false … 

tldr;如果您需要将 A 和 B 的知识分开,那么您必须以某种明确的方式这样做。

【讨论】:

  • 感谢您的意见!但是如果我还有一些条件要检查呢,以这种方式进行操作是相当复杂的。我确实知道这是目前摆脱解决方案的最佳方法,但是如果我们可以在这里使用反射 API 会怎样。请问有什么建议吗?
  • 关于尝试用反射解决一个简单的编程问题的建议:不要。这是一个正确的方法是仔细布置源代码序列的问题。我推荐我给出的第一个例子,它是一个一个地处理“负面情况”(通常是错误条件)。很清楚,可以维护,不难。
猜你喜欢
  • 2014-08-13
  • 2021-12-19
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 2020-01-20
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多