streams print parallel lambdas into ejemplo divided java java-8 java-stream

java - print - Filtrado de secuencias para la mejor coincidencia



stream java 8 ejemplo (4)

Asumiendo que la persona implementa equals y hashCode:

Person personToFind = new Person("Doe", "Jane"); Person person = persons.stream() .filter(p -> p.equals(personToFind)) .findFirst() .orElseGet(() -> persons.stream() .filter(p -> p.getSurname().equals(personToFind.getSurname())) .findFirst() .orElseThrow(() -> new RuntimeException("Could not find person ...")) );

Mi objetivo es filtrar para una mejor coincidencia. En mi ejemplo, tengo una lista de personas, que quiero filtrar por apellido y nombre.

La prescendencia correspondiente sería:

  1. tanto el apellido como el primer nombre, regresan el primer partido
  2. solo apellidos del partido, volver primer partido
  3. ninguno coincide, lanza alguna excepción

Mi código hasta ahora:

final List<Person> persons = Arrays.asList( new Person("Doe", "John"), new Person("Doe", "Jane"), new Person("Munster", "Herman"); Person person = persons.stream().filter(p -> p.getSurname().equals("Doe")).???


La herramienta correcta es .findFirst() . También puedes usar .limit(1) .


Propondría esto:

Optional<Person> bestMatch = persons.stream() .filter(p -> "Doe".equals(p.getSurname())) .reduce((person, person2) -> { if ("John".equals(person.getFirstName())) { return person; } else if ("John".equals(person2.getFirstName())) { return person2; } return person; }); Person result = bestMatch.orElseThrow(IllegalArgumentException::new);


Puedes usar

Person person = persons.stream() .filter(p -> p.getSurName().equals("Doe")) .max(Comparator.comparing(p -> p.getFirstName().equals("Jane"))) .orElse(null);

Solo considerará los elementos que tengan el apellido correcto y devolverá el mejor elemento de ellos, que es el que tiene un nombre coincidente. De lo contrario, se devuelve el primer elemento coincidente.

Como ya se mencionó en un comentario , un bucle for podría ser más eficiente si hay un mejor elemento, ya que puede provocar un cortocircuito. Si no hay un mejor elemento con un apellido y un nombre coincidentes, todos los elementos deben verificarse en todas las implementaciones.