2011-01-13 3 views
8

Вопрос прост, есть функциональный эквивалент знаменитого iif в java?Java Equivalent to iif function

Например:

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

Спасибо заранее.

+1

JJnguy: Нет, 'iif' является inline-if, которая принимает логическое значение в качестве своего первого параметра, а когда true возвращает второй параметр, а когда false возвращает третий параметр. – Gabe

+1

Для потомков: обратите внимание, что принятый ответ на самом деле не является правильным в отношении короткого замыкания. Прочитайте http://stackoverflow.com/questions/822810/iif-equivalent-in-c вместо этого ... – dkarp

ответ

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

или в данном случае, очевидно, можно было бы просто написать

vData.equals("S") 
+1

** Особенно ** второй бит. Это не так очевидно для многих людей. –

+1

Это не совсем то же самое. Использование 'IIF (x, y, z)' всегда будет оценивать 'y' и' z' (вызывающие побочные эффекты обоих видимых), а 'x?y: z' будет только убеждать 'y' xor' z' (вызывая только видимые побочные эффекты только одного). – Gabe

+0

@Gabe: VB не поддерживает оценку короткого замыкания в целом. Хотя VB.NET делает – sblundy

5

Да, тройное оп ? :

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

спасибо за быстрый ответ ... – seba123neo

2

, если одно и то же, как логическое тогда и только тогда.

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

или

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

или

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

EDIT: Однако его вполне вероятно, что вам не нужно переменную вместо этого вы можете воздействовать на результат. например

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

Кстати, можно считать хорошей практикой использовать

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

Разница в том, что это VDATA является недействительным первый пример сгенерирует исключение, в то время как второй будет ложным. Вы должны спросить себя, что бы вы предпочли.

+0

спасибо за ответ. – seba123neo

3

Основное различие между тройным оператором Java и IIf является то, что IIf оценивает как возвращаемое значение и невозвращенное значение, в то время как тройной оператор короткого замыкание и оценивает только возвращаемое значение. Если есть побочные эффекты для оценки, они не эквивалентны.

Вы можете, конечно, переопределить IIf как статический метод Java. В этом случае оба параметра будут оцениваться во время разговора, как и в случае с IIf. Но нет встроенной функции языка Java, которая точно равна IIf.

public static <T> T iif(boolean test, T ifTrue, T ifFalse) { 
    return test ? ifTrue : ifFalse; 
} 

(Обратите внимание, что аргументы ifTrue и ifFalseдолжны быть одного и того же типа в Java, либо с трехзначным оператором или с помощью этой общей альтернативы.)

+0

спасибо, я понимаю, похоже на функцию AndAlso, OrElse в VB NET, правильно? – seba123neo

+0

Да, это еще один пример короткого замыкания. – dkarp