Вы можете немного упростить свой код, осознав, что вам не нужна сложная конструкция if-else.
Вы либо добавляете в свой список, если item.getDescr().trim().isEmpty()
пуст, либо если второй параметр передает isCurrentParameterActive
тест. Обратите внимание на либо - либо в предложении выше.
Вы можете упростить этот тест до
Predicate<Item> isActive = item -> {
String[] parts;
return item.getDescr().trim().isEmpty()
|| ((parts = item.getDescr().trim().split(";")).length == 2
&& isCurrentParameterActive(parts[1]));
};
Обратите внимание, что вы также можете избежать выделения массива, просто проверив, присутствует ли ;
в строке (через String#indexOf()
), но только один ;
, и вы можете получить некоторую микрооптимизацию, только обрезав описание один раз, как @Holger упомянул в комментарии. Собирая все это вместе, вы получаете:
Predicate<Item> isActive = item -> {
var description = item.getDescr().trim();
int partition;
return description.isEmpty()
|| ((partition = description.indexOf(";")) > 0
&& description.indexOf(';', partition) < 0
&& isCurrentParameterActive(description.substring(partition)));
};
После этого вы можете просто отфильтровать все допустимые элементы из потока, а затем сопоставить их один раз с BigDecimal
и собрать в список:
Arrays.stream(getList())
.filter(isActive)
.map(item -> new BigDecimal(item.getCode().trim()))
.collect(Collectors.toList());
Объединение всего этого дает:
public List<BigDecimal> func() {
Predicate<Item> isActive = item -> {
var description = item.getDescr().trim();
int partition;
return description.isEmpty()
|| ((partition = description.indexOf(";")) > 0
&& description.indexOf(';', partition) < 0
&& isCurrentParameterActive(description.substring(partition)));
};
return Arrays.stream(getList())
.filter(isActive)
.map(item -> new BigDecimal(item.getCode().trim()))
.collect(Collectors.toList());
}
Кроме того, было бы разумно изменить getList()
, чтобы фактически вернуть список, который может быть пустым (используйте Collections.emptyList()
).