У меня есть следующий код, который работает на два значения, а именно. List
из String
и String
. И List
, и String
могут быть null
.
List<String> myStringList = getMyStringList(); // may return null
String myString = "abc"; // may be null
List<String> finalStringList = Optional.ofNullable(myStringList)
.map(strings -> strings.stream()
.filter(obj -> StringUtils.isEmpty(myString)
|| myString.equals(obj))
.collect(Collectors.toList()))
.orElseGet(ArrayList::new);
Идея такова: если myStringList
равно null
, то в результате будет пусто ArrayList
. Если myString
равно null
, вернуть myStringList
как есть. Если myString
не равно нулю, выполните цикл по списку и верните все элементы, соответствующие myString
.
Проблема в том, что с решением, приведенным выше, я все еще перебираю весь список (strings.stream
), даже когда myString
ноль.
Предполагая, что myStringList
очень большой, как я могу избежать зацикливания списка для случая, когда myString
равен нулю?
То есть
1) сделатьпроверка нуля в списке. Если ноль, вернуть новый пустой список.
2) сделать проверку на ноль myString
. Если ноль, вернуть список как БЕЗ ЗАПУСКА.
3) если myString
не ноль, перебрать список и вернуть отфильтрованный список.