Java中的条件方法链

15

如何最好地将多个方法链接在一起?在我的情况下,有四个方法。如果第一个方法的输出为true,则必须调用第二个方法。

例如:

flag = method1();
if (flag){
  flag = method2();
}
if (flag){
  method3();
} 
// and so on for next methods ..

使用嵌套的条件运算符。它可能不易读,但它会起作用。 - nicomp
在最后一个方法执行完毕后,您需要返回“flag”吗? - fps
1
按照什么标准来衡量“最好”? - TylerH
7个回答

20

使用逻辑 AND 运算符 &&

if (method1() && method2() && method3() && method4()) {
    ........
}
Java从左到右评估这个条件。如果任何一个方法返回false,那么评估就停止了,因为最终结果是false(短路评估)。
Java会按照从左到右的顺序对条件进行评估。如果任何一个方法返回false,则评估会停止,因为最终结果是false(短路评估)。

那不会在标志中放置任何内容。 - nicomp
8
这样做不需要旗帜。 - forpas
6
如果你知道你在做什么,阅读起来并不困难。 - forpas
@forpas,“如果你知道”是一个关键。如果你阅读代码,可能想知道作者做了什么。在这种情况下,更好的解决方案是嵌套的if语句if(method1()){if(method2(){…}},看起来不太好,但更容易理解。 - Koziołek
值得一提的是,这取决于副作用是否可接受。我认为这是可读性和期望的问题;通常我不希望布尔值函数执行副作用。当然,如果方法被命名为“doTheSideEffect()”,那么这一点可能就无关紧要了。 - Rebecca Nelson
显示剩余6条评论

7

如果flag在后面没有用,则应使用@forpas的答案,否则我会这样做:

flag = method1() && method2() && method3() && method4()

5
首先,我想说的是,这个答案并不比这个答案或者这个答案更加高效,而是另一种你可以在保持你的“短路”的要求的同时完成手头任务的方法。
因此,第一步是创建一个如下所示的方法:
public static boolean apply(BooleanSupplier... funcs){
      return Arrays.stream(funcs).allMatch(BooleanSupplier::getAsBoolean);
}

这个函数接受任意数量的函数,这些函数的签名必须是() -> boolean,也就是说,它们都是供应商函数(不带输入参数并返回布尔结果的函数)。

然后,您可以使用方法引用调用它,如下所示:

if(apply(Main::method1, 
         Main::method2, 
         Main::method3, 
         Main::method4)){ ... };

Main是定义方法的类。

或lambda表达式:

if(apply(() -> method1(), 
         () -> method2(), 
         () -> method3(), 
         () -> method4())){ ... };

1
如果列表超过3或4个,这个可能更易读。 - jpmc26

3
为了使用短路运算符并保持代码易读性,您可以这样做:
boolean flag = method1();
flag = flag && method2();
flag = flag && method3();

等等。请注意,您不能使用 flag&= methodX() ,因为它不会短路计算。


2
嵌套条件运算符可以解决这个问题:
flag = method1() ? (method2() ? method3(): false): false;

不错 +1,你可以简化为 flag = method1() && (method2() && method3());。假设在条件之后需要 flag,那么这是一个很好的方法。 - Ousmane D.
@Aomine 我认为那会是比这更好的答案。 - eis
@Aomine 但是条件运算符却鲜有人提及! :) - nicomp
1
@nicomp 好的,那我就把它作为答案发布了 :). #eis 当然。 - Ousmane D.

1
你可以使用 && 运算符:
boolean flag = method1() && method2() && method3() && method4() && ...;

做任何与flag相关的事情。


0

如果需要保存方法的真值或者需要发生其他副作用:

boolean flag;
switch(1){
  case 1: flag = method1();  
          //additional code goes here

          if(!flag) break; 
  case 2: flag = method2();
          //additional code goes here

          if(!flag) break; 
     ....
  default: flag = method10();
          if(!flag) break; 
}

你不应该想要这个,而且这是意料之外的。 但这是一种可读性较高的方式,可以向每个代码路径添加附加语句。

否则:以不同的方式处理或退回到if语句。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接