Java中等同于iif函数的功能

11

问题很简单,Java中是否有著名函数iif的等效函数?

比如:

IIf (vData = "S", True, False)

提前感谢。


1
JJnguy:不,iif是一种内联-if函数,它以布尔值作为其第一个参数,当为真时返回第二个参数,当为假时返回第三个参数。 - Gabe
1
为了后人:请注意,接受的答案实际上在短路方面是不正确的。请阅读 https://dev59.com/YHRA5IYBdhLWcg3wyRN7 代替... - dkarp
4个回答

27
vData.equals("S") ? true : false

或者在这种特殊情况下,显然可以直接编写

vData.equals("S")

2
特别是第二部分。这对很多人来说并不那么明显。 - Matt Ball
1
这并不完全相同。使用 IIF(x, y, z) 将始终评估 yz(导致两者的副作用都可见),而 x ? y : z 只会评估 yz 中的一个(只导致其中一个的副作用可见)。 - Gabe
@Gabe:一般来说,VB不支持短路求值。但是VB.NET支持。 - sblundy
谢谢Adrian,所有的回答都对我有帮助。 - seba123neo

6

是的,三元运算符? :

vData.equals("S") ? true : false

4
Java三元运算符和IIf之间的主要区别在于,IIf会评估返回值未返回值,而三元运算符会短路并仅评估返回值。如果评估存在副作用,则两者不等价。
当然,您可以将IIf重新实现为静态Java方法。在这种情况下,与IIf一样,在调用时将同时评估两个参数。但是,没有内置的Java语言功能完全等同于IIf。
public static <T> T iif(boolean test, T ifTrue, T ifFalse) {
    return test ? ifTrue : ifFalse;
}

(请注意,在Java中,ifTrueifFalse参数必须是相同的类型,可以使用三元运算符或使用此通用替代方法。)

谢谢,我明白了。类似于VB NET中的AndAlso和OrElse函数,对吗? - seba123neo
是的,这是短路的另一个例子。 - dkarp

2

if相当于逻辑上的“当且仅当”。

boolean result;
if (vData.equals("S"))
   result = true;
else
   result = false;

或者

boolean result = vData.equals("S") ? true : false;

或者

boolean result = vData.equals("S");

编辑:然而很可能您不需要变量,而是可以对结果进行操作。例如:

if (vData.equals("S")) {
   // do something
} else {
   // do something else
}

顺便提一下,使用这种方式可能被视为良好的实践

 if ("S".equals(vData)) {

两者的区别在于如果vData为空,第一个示例会抛出异常,而第二个则会返回false。你应该考虑一下你更希望发生什么。


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