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:
- tanto el apellido como el primer nombre, regresan el primer partido
- solo apellidos del partido, volver primer partido
- 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.