Java 8 Stream noneMatch() com exemplos

Stream se tem se tornado cada vez mais popular no desenvolvimento em java, neste post vou mostrar como utilizar Stream noneMatch() em Java com exemplos

Wolmir Cezer Garbin por Wolmir Cezer Garbin - - Java - TUTORIAL

Última atualização em: | 8361 Visualizações

O Stream possui 3 principais métodos para verificação de listas: allMatch(), anyMatch() e noneMatch(). Caso queira saber mais sobre a diferença entre eles leia: Entendendo a diferença entre Stream allMatch(), anyMatch() e noneMatch()

Stream noneMatch() retorna um valor boolean (true/false).

Retorna true se nem um dos elemento do fluxo corresponder ao predicado fornecido. Pode ainda não avaliar o predicado em todos os elementos se não for necessário para determinar o resultado. Caso uma opção retornar true, os itens restantes não precisam ser avaliados para determinar que alguns dos itens do stream não condiz com o predicate.

anyMatch() elementos divisíveis por 2

Vamos entender usando um exemplo. Nestes exemplo temos uma lista de inteiros e queremos saber se um dos elementos da lista é divisível por 2. Neste caso utilizamos o anyMatch() para determinar se na lista existe um elemento que seja divisível por 2. Veja:

import org.junit.Test;
import java.util.Arrays;
import java.util.List;

import static org.junit.Assert.assertFalse;

public class StreamNomeMatch {

    @Test
    public void testNoneMatch() {
        List<Integer> ls = Arrays.asList(2, 3, 4, 5, 6, 7);
 
        boolean result = ls.stream().noneMatch(n -> {
            System.out.println("Verify: " + n);
            return n % 2 == 0;
        });

        assertFalse(result);
    }
}

Ao executar este código, temos a seguinte saída no console:

Verify: 2

Note que foram impressos no console apenas o número 2.



E em seguida temos o teste sendo aprovado pois o valor retornado foi false. Isso significa que ao executar o predicate para o valor número 2 foi verificado retornando true para o predicate, os itens seguintes foram ignorados. Assim temos o resultado sem passar por todos os itens.

noneMatch() verificar tamanho de String

Vamos ao segundo exemplo onde não esperamos encontrar nenhum item em uma lista que tenha uma String com menos de 5 caracteres. Veja:

import org.junit.Test;
import java.util.Arrays;
import java.util.List;

import static org.junit.Assert.assertTrue;

public class StreamNomeMatch {

    @Test
    public void testNoneMatch() {
        // Create list
        List<String> ls = Arrays.asList("Receitas", "Código", "Stream", "allMatch");

        boolean result = ls.stream().noneMatch(name -> {
            System.out.println("Verify: " + name);
            return name.length() < 5;
        });

        assertTrue(result);
    }
}

A saída no console para este teste é:

Verify: Receitas
Verify: Código
Verify: Stream
Verify: allMatch

E em sequencia temos o testes indicando que o valor retornado foi verdadeiro: assertTrue(result);.

noneMatch() com objeto

Neste outro exemplo vamos fazer uma checagem em uma lista de pessoas para verificar se nenhuma pessoa é menor de 18 anos. Veja:

import lombok.AllArgsConstructor;
import lombok.Data;
import org.junit.Test;

import java.util.stream.Stream;

import static org.junit.Assert.assertTrue;

public class StreamNomeMatch {

    @Test
    public void testNoneMatch() {
        // Create list
        Stream<Person> personStream = Stream.of(new Person("Wolmir", 32), new Person("Cesar", 20));

        boolean result = personStream.noneMatch(person -> person.getAge() < 18);

        assertTrue(result);
    }

    @Data
    @AllArgsConstructor
    public class Person {
        private String name;
        private Integer age;
    }
}

Note que @Data e @AllArgsConstructor são anotações do lombok. Pode saber mais neste post: Como usar o Lombok em projetos Java

Neste exemplo criamos um Stream contendo pessoas e utilizamos o noneMatch() para verificar se não existe nenhuma pessoa com menos de 18 anos. Sua execução não imprime nada no console e retorna true por que ambas as pessoas possuem acima de 18 anos.

Conclusão sobre noneMatch()

Usando um predicate conseguimos verificar se um elemento de uma lista atendem determinado requisito. Com o uso do noneMatch() não precisamos fazer o uso de iterações, simplificando a leitura e escrita do código.

Não esqueca de deixar suas dúvidas nos comentários e compartilhar este post.


Apoiadores

Publique seu post no Receitas de Código

Aguarde, estamos trabalhando para que você possa publicar sua postagem no Receitas de Código!