ТЛ; др
Если вашей целью является сжатый код, то используйте троичное связывание. Производительность, вероятно, идентична производительности ряда операторов if-then-else.
( this.getA() != null ) ? this.getA()
: ( this.getB() != null ) ? this.getB()
: ( this.getC() != null ) ? this.getC()
: null;
Тройная цепочка
Как правильно говорит Answer by Lino , вы пытаетесь вывести Optional
за пределы их первоначального замысла (возвращая значения в лямбдах и потоках). Как правило, лучше использовать Optional
только с оператором return
и только тогда, когда вы хотите четко указать, что значение null является допустимым значением, которое должно быть возвращено. См. этот ответ Брайана Гетца.
A троичный оператор представляет собой сжатый if-then-else
, объединенный в однострочник.
result = test ? valueToUseIfTestIsTrue : valueToUseIfTestIsFalse
* * 1 022 Пример: * 1 023 *
Color color = isPrinterMonochrome ? Color.GREY : Color.GREEN ;
Используйте цепочку троичных операторов.
Итак, это:
if ( this.getA() != null )
return this.getA();
else if ( this.getB() != null )
return this.getB();
else if ( this.getC() != null )
return this.getC();
else return null;
… становится таким:
return
( this.getA() != null ) ? this.getA()
: ( this.getB() != null ) ? this.getB()
: ( this.getC() != null ) ? this.getC()
: null;
Пример кода.
public String getA ()
{
// return "A";
return null;
}
public String getB ()
{
// return "B";
return null;
}
public String getC ()
{
return "C";
// return null;
}
public String getABC ()
{
if ( this.getA() != null )
return this.getA();
else if ( this.getB() != null )
return this.getB();
else if ( this.getC() != null )
return this.getC();
else return null;
}
public String getABCTernary ()
{
return
( this.getA() != null ) ? this.getA()
: ( this.getB() != null ) ? this.getB()
: ( this.getC() != null ) ? this.getC()
: null;
}
Запустите этот пример кода.
String s = this.getABCTernary();
System.out.println( "s: " + s );
C
Плюсы и минусы
- Верх троичной цепочки - сжатый код, свернутый в одну строчку.
- Недостатком является то, что в данной конкретной ситуации вы дважды вызываете свой метод получения, чтобы получить единственное значение. Не проблема для простого метода получения из переменной «выборка-переменная», но она влияет на производительность, если метод получения занимает много времени, например, вызов удаленных веб-служб. И каскадное if-then-else имеет ту же проблему, также вызывая ваш геттер дважды.
Производительность
как эти два сравниваются с точки зрения производительности
Тернарный оператор в Java - это «короткое замыкание» , означающее, что левая или правая сторона, соответствующая результатам теста, является единственным вызванным кодом. В нашем коде, если getA
возвращает ненулевое значение, это значение возвращается немедленно. Дальнейшие вызовы getB
и getC
никогда не выполняются. Таким образом, в этом отношении производительность цепочечной троичной системы совпадает с каскадным оператором if-then-else: первое совпадение выигрывает, дальнейших вызовов нет.
Если вы имеете в виду производительность как в наносекундах выполнения, я не знаю. Беспокойство об этом может попасть в ловушку преждевременной оптимизации . Современные JVM чрезвычайно хорошо настроены для оптимизации вашего кода.