Issue
Let's say I have a list of names:
List<String> names = new ArrayList<>();
names.add("Paul");
names.add("Jeff");
names.add("Anna");
On the other hand, I have a list of people:
List<Person> people = new ArrayList<>();
people.add( new Person("Paul", 30) );
people.add( new Person("Jeff", 50) );
Person has name and age attributes. From the first list of names, I need to know what names are not present as names in the list of people. This is my attempt:
List<String> namesNotPresent = new ArrayList<>();
for (String name : names) {
boolean nameNotPresent = people.stream()
.noneMatch(p -> name.equals(p.getName()));
if (nameNotPresent) {
namesNotPresent.add(name);
}
}
I wonder if there is a better approach, a more functional one, and I also wonder if the list of people should be ordered?
This is working for me though. I don't expect the list of names and people to be a huge list, there might be exceptions where they could have around 1000 items though.
Solution
public List<String> findNameNotPresent(List<String> names, List<Person> people) {
List<String> result = new ArrayList<>(names);
people.stream()
.map(Person::getName)
.forEach(result::remove);
return result;
}
Answered By - Kai-Sheng Yang
Answer Checked By - Marie Seifert (JavaFixing Admin)