A simple little thing.
I like to use streams and filters, and I was wondering what's the best way to go about some things.
For example: I wish to search for a person in a list of Persons.
@Test
public void testSimple() {
Person personToFind = new Person(null, "Mr.", "Bear", "Netherlands");
Person otherPersonToFind = new Person(null, "Linda", "Lovelace", "England");
assertThat(Persons.get().stream()
.filter(person -> Objects.equals(personToFind.name(), person.name()) &&
Objects.equals(personToFind.surname(), person.surname()) &&
Objects.equals(personToFind.country(), person.country()))
.findFirst()).isPresent();
assertThat(Persons.get().stream()
.filter(person -> Objects.equals(otherPersonToFind.name(), person.name()) &&
Objects.equals(otherPersonToFind.surname(), person.surname()) &&
Objects.equals(otherPersonToFind.country(), person.country()))
.findFirst()).isEmpty();
}
This works, but the single filter with all the && in it seems a bit unreadable.
Of course, I could replace the x&&y&&z by three filters, as it boils down tot the same thing.
@Test
public void testSimple2() {
Person personToFind = new Person(null, "Mr.", "Bear", "Netherlands");
Person otherPersonToFind = new Person(null, "Linda", "Lovelace", "England");
assertThat(Persons.get().stream()
.filter(person -> Objects.equals(personToFind.name(), person.name()))
.filter(person -> Objects.equals(personToFind.surname(), person.surname()))
.filter(person -> Objects.equals(personToFind.country(), person.country()))
.findFirst()).isPresent();
assertThat(Persons.get().stream()
.filter(person -> Objects.equals(otherPersonToFind.name(), person.name()))
.filter(person -> Objects.equals(otherPersonToFind.surname(), person.surname()))
.filter(person -> Objects.equals(otherPersonToFind.country(), person.country()))
.findFirst()).isEmpty();
}
But my colleague always likes to use specific methods for lambdas, even if they're only a little complex. It just reads easier.
private boolean compare(Person person, Person otherPerson) {
return Objects.equals(otherPerson.name(), person.name()) &&
Objects.equals(otherPerson.surname(), person.surname()) &&
Objects.equals(otherPerson.country(), person.country());
}
@Test
public void testSimple3() {
Person personToFind = new Person(null, "Mr.", "Bear", "Netherlands");
Person otherPersonToFind = new Person(null, "Linda", "Lovelace", "England");
assertThat(Persons.get().stream()
.filter(person -> compare(person, personToFind))
.findFirst()).isPresent();
assertThat(Persons.get().stream()
.filter(person -> compare(person, otherPersonToFind))
.findFirst()).isEmpty();
}
My personal preference is the last one.