Como fazer java 8 Fluxo mapa de forma contínua com verificação nulo

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 exceptionpossí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::getCoveragesretorna uma coleção, portanto, o filtro Coverage::isMainplannão trabalho, em vez disso você deve flatMapas seqüências voltou depois .map(Life::getCoverages)aplique a filteroperaçã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:

  1. Eu adicionei .filter(Objects::nonNull)depois .map(Life::getCoverages)que você pode descomentar dados os elementos retornados poderia ser nulo.
  2. 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.
  3. Eu adicionei um outro .filter(Objects::nonNull)que você pode descomentar dados os elementos retornados após flatMappoderia ser nulo.
  4. Estamos em seguida, numa fase em que podemos aplicar .filter(Coverage::isMainplan)e, finalmente, recuperar o primeiro objeto que satisfazem os critérios via findFirste se nenhum, então, fornecer um valor padrão via orElse.

Eu sugiro ter um olhar para os seguintes blogs para se familiarizar com o flatMapmétodo:

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=136507&siteId=1
Recomendado
Clasificación