Dang Nguyen:
Eu tenho este pedaço de código
Coverage mainCoverage = illus.getLifes().stream()
.filter(Life::isIsmain)
.findFirst()
.orElseThrow(() -> new ServiceInvalidAgurmentGeneraliException(env.getProperty("MSG_002")))
.getCoverages()
.stream() // <==may cause null here if list coverage is null
.filter(Coverage::isMainplan)
.findFirst()
.orElseThrow(() -> new ServiceInvalidAgurmentGeneraliException(env.getProperty("MSG_002")));
que é totalmente bom trabalho, mas eu acho que é um pouco confuso pouco e não cobrir todo o null pointer exception
possível (ver comentário).
Tento refatorar esse código em
Coverage mainCoverage1 = illus.getLifes().stream()
.filter(Life::isIsmain)
.map(Life::getCoverages)
.filter(Coverage::isMainplan) //<== cannot filter from list coverage to one main coverage
...
Parecem depois que eu mapear a vida a cobertura não é uma lista de cobertura mais. Então a questão é como posso refatorar a primeira seção em seguro nulo e talvez encurtá-lo?
Ousmane D .:
Life::getCoverages
retorna uma coleção, portanto, o filtro Coverage::isMainplan
não trabalho, em vez disso você deve flatMap
as seqüências voltou depois .map(Life::getCoverages)
aplique a filter
operação no Coverage
:
Coverage mainCoverage =
illus.getLifes()
.stream()
.filter(Life::isIsmain)
.map(Life::getCoverages)
//.filter(Objects::nonNull) uncomment if there can be null lists
.flatMap(Collection::stream) // <--- collapse the nested sequences
//.filter(Objects::nonNull) // uncomment if there can be null Coverage
.filter(Coverage::isMainplan)
.findFirst().orElse(...);
Eu adicionei algumas coisas ao seu código:
- Eu adicionei
.filter(Objects::nonNull)
depois.map(Life::getCoverages)
que você pode descomentar dados os elementos retornados poderia ser nulo. - Eu adicionado
.flatMap(Collection::stream)
que retorna uma corrente consistindo dos resultados da substituição de cada elemento deste fluxo com o conteúdo de um fluxo mapeado produzida aplicando a função de mapeamento fornecida a cada elemento. - Eu adicionei um outro
.filter(Objects::nonNull)
que você pode descomentar dados os elementos retornados apósflatMap
poderia ser nulo. - Estamos em seguida, numa fase em que podemos aplicar
.filter(Coverage::isMainplan)
e, finalmente, recuperar o primeiro objeto que satisfazem os critérios viafindFirst
e se nenhum, então, fornecer um valor padrão viaorElse
.
Eu sugiro ter um olhar para os seguintes blogs para se familiarizar com o flatMap
método: