logo

anyMatch() em Java 8

Em Java 8, anyMatch() é um método definido na interface Stream. Ele realiza um operação do terminal em curto-circuito. Nesta seção, discutiremos o Método anyMatch() em Java 8 Stream com um exemplo. Antes de ir direto ao ponto, primeiro entenderemos detalhadamente as operações intermediárias e terminais.

No fluxo Java 8, as operações de fluxo são divididas em intermediário (como Stream.filter, Stream.map) e terminal (como Stream.forEach, Steam.reduce). Para obter os resultados desejados, precisamos combinar essas operações que formam pipelines de fluxo.

Operações Intermediárias

As operações intermediárias são preguiçosas (significa que não executam a operação real, em vez disso retornam um novo fluxo) por natureza. Significa reter os elementos do fluxo inicial e sempre retornar um novo fluxo do fluxo inicial. Observe que a execução do pipeline não começa até que a operação terminal do pipeline seja executada.

As operações intermediárias são ainda divididas em apátrida operações (como filtro e mapa) e com estado operações (como distintas e classificadas).

limpando cache npm

Operação sem Estado

As operações sem estado não retêm o estado dos elementos vistos anteriormente durante o processamento de um novo elemento. Cada elemento pode ser processado independentemente de operações em outros elementos.

Operação com estado

As operações com estado retêm o estado dos elementos vistos anteriormente enquanto processam os novos elementos. A propriedade da operação com estado é que ela processa toda a entrada antes de produzir um resultado.

Suponha que estamos realizando a operação de classificação no fluxo e queremos produzir o resultado desse fluxo sem ver todos os elementos do fluxo, o que não é possível. Portanto, até que não se vejam todos os elementos do fluxo, não se pode produzir o resultado. Portanto, precisamos processar toda a entrada antes de produzir o resultado.

Operação Terminal

As operações terminais atravessam o fluxo para produzir um resultado ou efeito colateral. Assim que a operação do terminal for executada, o pipeline do stream é considerado consumido. Após o consumo, não poderá mais ser utilizado. Caso precisemos percorrer a mesma fonte de dados (stream), retornar o stream para obter um novo stream.

Quase todas as operações do terminal são de natureza ansiosa. Isso significa que eles atravessam o fluxo e processam o pipeline antes de retornar. Observe que isso não é permitido em operações de dois terminais, ou seja, iterator() e spliterator().

Além das operações acima, existe outra operação conhecida como curto-circuito Operação. Ambas as operações intermediárias e terminais podem entrar em curto-circuito.

Um operação intermediária está em curto-circuito se houver um fluxo com entrada infinita. Como resultado, pode produzir um fluxo finito.

A operação terminal está em curto-circuito se houver um fluxo com entrada infinita. Pode terminar em um tempo finito.

Observamos que utilizar uma operação de curto-circuito na tubulação é essencial, mas não suficiente. Existe uma condição para processar um fluxo infinito que é encerrar a operação normalmente em tempo finito.

Java 8 Stream.anyMatch()

Ele retorna se algum elemento deste fluxo corresponde ao predicado fornecido. Pode não avaliar o predicado em todos os elementos se não for necessário para determinar o resultado.

string em métodos java

Sintaxe:

 boolean anyMatch(Predicate predicate) 

Parâmetros: Ele aceita um não interferente e apátrida predicado que deve ser aplicado aos elementos do fluxo de entrada.

Retorna: Ele retorna verdadeiro se algum elemento corresponder ao predicado especificado, caso contrário, retornará falso. Retorna falso, se o fluxo estiver vazio. No caso de um fluxo vazio, o predicado não é avaliado.

Exemplo Java anyMatch()

AnyMatchExample1.java

 import java.util.stream.Stream; public class AnyMatchExample1 { public static void main(String args[]) { Stream stream = Stream.of('Java', 'Python', 'Hadoop', 'C#', 'C++', 'Kotlin'); boolean match = stream.anyMatch(s -> s.contains('Python')); System.out.println(match); } } 

Saída:

 true 

O exemplo a seguir descreve um fluxo vazio que sempre retorna falso.

AnyMatchExample2.java

em string em java
 import java.util.Arrays; public class AnyMatchExample2 { public static void main(String args[]) { boolean b = Arrays.asList().stream().anyMatch(e -> true); System.out.println(b); } } 

Saída:

 false 

Vejamos outro programa Java no qual analisamos vários predicados.

Para satisfazer múltiplas condições, crie um predicado composto com dois ou mais predicados simples. No exemplo dado, temos uma lista de Funcionários. Queremos verificar se há um funcionário com 28 anos e cujo nome começa com o alfabeto R. O programa Java a seguir mostra o mesmo.

AnyMatchExample.java

 import java.util.List; import java.util.function.Predicate; import java.util.ArrayList; class Employee { int empId; int empAge; String empName; //creating a constructor of the Employee class Employee(int id, int age, String name) { this.empId = id; this.empAge = age; this.empName = name; } public int getEmpId() { return empId; } public int getEmpAge() { return empAge; } public String getEmpName() { return empName; } public static List getEmployee() { //instance of the List class List list = new ArrayList(); //adding elements to the List list.add(new Employee(21, 21, &apos;Andrew&apos;)); list.add(new Employee(23, 28, &apos;Robert&apos;)); list.add(new Employee(32, 29, &apos;Jack&apos;)); list.add(new Employee(12, 31, &apos;Steve&apos;)); list.add(new Employee(15, 27, &apos;Tom&apos;)); list.add(new Employee(19, 29, &apos;Albert&apos;)); return list; } } //driver code public class AnyMatchExample { public static void main(String args[]) { //defining predicates Predicate p1 = e -&gt; e.empName.startsWith(&apos;S&apos;); Predicate p2 = e -&gt; e.empAge <28 && e.empname.startswith('r'); predicate p3="e" -> e.empName.startsWith(&apos;P&apos;); List list = Employee.getEmployee(); //anyMatch() method checks whether any Stream element matches the specified predicate boolean bool1 = list.stream().anyMatch(p1); //prints true if any element of the List starts with the letter s, else prints false System.out.println(bool1); boolean bool2 = list.stream().anyMatch(p2); //prints true if any element of the List starts with the letter z and age is less than 28, else prints false System.out.println(bool2); //anyMatch() method checks whether any Stream element matches the specified predicate boolean bool3 = list.stream().anyMatch(p3); //prints true if any element of the List starts with the letter P, else prints false System.out.println(bool3); } } </28>

Saída:

 true true false 

A interface Stream fornece outro método para corresponder ao predicado especificado, ou seja, todas as correspondências() . A diferença entre allMatch() e anyMatch() é que anyMatch() retorna verdadeiro se algum dos elementos em um fluxo corresponder ao predicado especificado. Ao usar allMatch(), todos os elementos devem corresponder ao predicado fornecido.

Portanto, o método anyMatch() pode ser usado em determinados casos quando queremos verificar se há pelo menos um elemento no fluxo. O método contains() da classe List também executa a mesma operação. Portanto, também podemos usar o método contains() no lugar do método anyMatch().

Portanto, não há diferença entre os métodos List.contains() e Stream.anyMatch().