Получить поток с пустой проверкой и возможностью использовать orElse () и orElseThrow () для коллекций - PullRequest
0 голосов
/ 26 февраля 2019

Optional.ofNullable() проверяет только значения null, а CollectionUtils.isNotEmpty() не возвращает поток.Есть ли способ объединить обе эти функции.

Как-то так -

Collection.isNotEmpty(entries)
                .orElseThrow(() -> new Exception("exception"))
                .stream()

Вместо -

Optional.ofNullable(entries)
                .orElseThrow(() -> new Exception("exception"))
                .stream()

Ответы [ 4 ]

0 голосов
/ 26 февраля 2019

Для сравнения рассмотрим следующее:

if (entries == null || entries.isEmpty()) {
    throw Exception("exception");
} else {
    return entries.stream();
}

(Хольгер упомянул почти то же самое в паре комментариев.)

На мой взгляд, использование Optional для этого случаяне является улучшением по сравнению с обычным оператором if / else.

0 голосов
/ 26 февраля 2019

Вы можете сопоставить потоку:

Optional.ofNullable(entries)
        .filter(a -> !a.isEmpty())
        .orElseThrow(() -> new Exception("exception"))
        // do whatever with the stream if available
0 голосов
/ 26 февраля 2019

Вы можете просто использовать filter(), чтобы убедиться, что он не пустой

Optional.ofNullable(entries)
    .filter(e -> !e.isEmpty())
    .orElseThrow(() -> new Exception("exception"))
    .stream()

Что касается вашего комментария, который вы хотите исключить null значений в самом потоке, вы можете использовать это:

Optional.ofNullable(entries)
    .filter(e -> !e.isEmpty())
    .orElseThrow(() -> new Exception("exception"))
    .stream()
    .filter(Objects::nonNull)
0 голосов
/ 26 февраля 2019

Возможно:

Optional.ofNullable((entries == null || entries.isEmpty()) ? null : entries)
        .orElseThrow(() -> new Exception("exception"))
        .stream()
...