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
Última atualização em: | 9185 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.