Ваши условия являются избыточными, учитывая, что результатом является только один из двух возможных результатов:
if (beDate == null && aeDate == null) {
eDate = null;
}
else if (beDate != null && aeDate == null) {
eDate = beDate;
}
...
Здесь eDate
будет иметь то же содержимое, что и beDate
в любом случае, будь то null
или нет. Так что if(aeDate == null) eDate = beDate;
было бы достаточно. Во всех других случаях вы присваиваете aeDate
, с одним единственным исключением:
...
else if (beDate != null && aeDate != null &&
(beDate.isEqual(aeDate) || beDate.isBefore(aeDate))) {
eDate = beDate;
}
...
Мы можем упростить beDate.isEqual(aeDate) || beDate.isBefore(aeDate)
до aeDate.isAfter(beDate)
.
Таким образом, весь оператор может быть записывается как:
LocalDateTime eDate
= aeDate == null || (beDate != null && aeDate.isAfter(beDate))? beDate: aeDate;
Короткое замыкание ||
означает, что правая сторона оценивается только тогда, когда левая сторона равна false
, поэтому, когда левая сторона равна aeDate == null
, для правой стороны подразумевается, что aeDate != null
и повторяться не нужно.
Таким образом, eDate
получит значение beDate
, когда aeDate
равно null
(первые два оператора if
) или когда оба не null
, а aeDate
- после beDate
(другой цитированный оператор if
), и получают значение aeDate
в противном случае.
Приоритет оператора делает скобки ненужными, но также допустимо сохранять их для ясности.