En Java 8, anyMatch() es un método definido en la interfaz Stream. Realiza un funcionamiento del terminal de cortocircuito. En esta sección, discutiremos la método anyMatch() en Java 8 Stream con un ejemplo. Antes de ir al grano, primero comprenderemos en detalle las operaciones intermedias y terminales.
En la secuencia de Java 8, las operaciones de secuencia se dividen en intermedio (como Stream.filter, Stream.map) y Terminal (como Stream.forEach, Steam.reduce) operaciones. Para obtener los resultados deseados, debemos combinar estas operaciones que forman tuberías de flujo.
Operaciones Intermedias
Las operaciones intermedias son de naturaleza diferida (es decir, no realizan la operación real, sino que devuelven una nueva secuencia). Es decir, retener los elementos del flujo inicial y siempre devolver un nuevo flujo del flujo inicial. Tenga en cuenta que la ejecución del ducto no comienza hasta que se ejecuta la operación terminal del ducto.
Las operaciones intermedias se dividen a su vez en apátrida operaciones (como filtro y mapa) y con estado operaciones (como distintas y ordenadas).
Operación sin estado
Las operaciones sin estado no retienen el estado de elementos vistos anteriormente mientras procesan un elemento nuevo. Cada elemento se puede procesar independientemente de las operaciones en otros elementos.
Operación con estado
Las operaciones con estado retienen el estado de los elementos vistos anteriormente mientras procesan los elementos nuevos. La propiedad de la operación con estado es que procesa toda la entrada antes de producir un resultado.
Supongamos que estamos realizando la operación de clasificación en la secuencia y queremos producir el resultado de esa secuencia sin ver todos los elementos de la secuencia, lo cual no es posible. Por lo tanto, hasta que no se vean todos los elementos de la corriente, no se podrá producir el resultado. Por lo tanto, necesitamos procesar toda la entrada antes de producir el resultado.
método principal de java
Operación de terminales
Las operaciones terminales atraviesan la corriente para producir un resultado o efecto secundario. Una vez ejecutada la operación del terminal, el arroyo se considera consumido. Después del consumo, ya no se puede utilizar. En caso de que necesitemos atravesar la misma fuente de datos (flujo), devuelva el flujo para obtener un nuevo flujo.
Casi todas las operaciones de la terminal son de naturaleza entusiasta. Es decir, atraviesan el arroyo y procesan la tubería antes de regresar. Tenga en cuenta que no está permitido en operaciones de dos terminales, es decir, iterador() y spliterator().
Además de las operaciones anteriores, existe otra operación conocida como cortocircuito operación. Tanto las operaciones intermedias como terminales pueden sufrir un cortocircuito.
Un operación intermedia Hay un cortocircuito si hay una corriente con entrada infinita. Como resultado, puede producir una corriente finita.
A operación terminal Hay un cortocircuito si hay una corriente con entrada infinita. Puede terminar en un tiempo finito.
Observamos que utilizar una operación de cortocircuito en la tubería es esencial pero no suficiente. Existe una condición para procesar una corriente infinita que es terminar la operación normalmente en un tiempo finito.
Java 8 Stream.anyMatch()
Devuelve si algún elemento de esta secuencia coincide con el predicado proporcionado. Es posible que no evalúe el predicado sobre todos los elementos si no es necesario para determinar el resultado.
pitón camelcase
Sintaxis:
boolean anyMatch(Predicate predicate)
Parámetros: Acepta un no interferir y apátrida Predicado que se aplicará a los elementos del flujo de entrada.
Devoluciones: Vuelve verdadero si algún elemento coincide con el predicado especificado, de lo contrario devuelve falso. Devuelve falso, si la secuencia está vacía. En el caso de una secuencia vacía, el predicado no se evalúa.
Ejemplo de 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); } }
Producción:
true
El siguiente ejemplo muestra que una secuencia vacía siempre devuelve falso.
AnyMatchExample2.java
patrones de diseño 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); } }
Producción:
false
Veamos otro programa Java en el que hemos analizado varios predicados.
Para satisfacer múltiples condiciones, cree un predicado compuesto con dos o más predicados simples. En el ejemplo dado, tenemos una lista de Empleados. Queremos verificar si hay un empleado cuya edad es 28 y el nombre comienza con el alfabeto R. El siguiente programa Java representa lo mismo.
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, 'Andrew')); list.add(new Employee(23, 28, 'Robert')); list.add(new Employee(32, 29, 'Jack')); list.add(new Employee(12, 31, 'Steve')); list.add(new Employee(15, 27, 'Tom')); list.add(new Employee(19, 29, 'Albert')); return list; } } //driver code public class AnyMatchExample { public static void main(String args[]) { //defining predicates Predicate p1 = e -> e.empName.startsWith('S'); Predicate p2 = e -> e.empAge <28 && e.empname.startswith('r'); predicate p3="e" -> e.empName.startsWith('P'); 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>
Producción:
true true false
La interfaz Stream proporciona otro método para hacer coincidir el predicado especificado, es decir. todas las coincidencias() . La diferencia entre allMatch() y anyMatch() es que anyMatch() devuelve verdadero si alguno de los elementos de una secuencia coincide con el predicado especificado. Cuando se utiliza allMatch(), todos los elementos deben coincidir con el predicado dado.
Por lo tanto, el método anyMatch() se puede utilizar en el caso concreto en el que queremos comprobar si hay al menos un elemento en la secuencia. El método contiene() de la clase Lista también realiza la misma operación. Entonces, también podemos usar el método contiene() en lugar del método anyMatch().
Por lo tanto, no hay diferencia entre el método List.contains() y Stream.anyMatch().