Пример, который вы дали, и ответы, приведенные здесь для него, нарушают некоторые принципы чистого функционального кодирования стиля.
Во-первых, вам не следует смешивать действия терминала и снова создавать потоки в той же цепочке / конвейере кода,Как и в вашем примере stream (). FindFirst (). OrElseThrow (..). Stream (). OtherActions.Это действительно не очень хорошая практика и подвержена ошибкам.В идеале цепочка вызовов API Java Stream должна работать с одним потоком.Таким образом легче следовать и рассуждать о вашем коде.
Во-вторых, вы упомянули, что этот бит может попасть в Null Pointer exc:
.getCoverages()
.stream() // <==may cause null here if list coverage is null
, если getCoverages () должен вернуть коллекцию,он никогда не должен возвращать ноль, всегда возвращать пустую коллекцию.
Разбейте ваш код на отдельные логические части и дайте ему несколько значимых имен:
Coverage mainCoverage = illus.getLifes().stream()
.filter(Life::isIsmain)
.findFirst()
.orElseThrow(() -> new ServiceInvalidAgurmentGeneraliException(env.getProperty("MSG_002")));
Coverage mainplan = mainCoverage.getCoverages().stream()
.filter(Coverage::isMainplan)
.findFirst()
.orElseThrow(() -> new ServiceInvalidAgurmentGeneraliException(env.getProperty("MSG_002")));
Это выглядит намного лучше, чем ваша начальная точка.Надеюсь, это поможет.