I'm fairly new to Java8. I have a requirement to subtract/remove POJOs in one list based on certain criteria (from another list) and show it on UI.
Iterate one list and search for condition Remove the object Send the original list to UI
Children.java
private String firstName;
private String lastName;
private String school;
private String personId;
// Setters and getters.
Person.java
private String personId;
private String fullName;
private String address;
// Setters and Getters.
..MAIN CODE..
// populated by other methods.
List<Person> personList;
//Connect to DB and get ChildrenList
List<Children> childrenList = criteria.list();
for(Children child : childrenList) {
personList.removeIf(person -> child.getPersonId().equals(person.getPersonId()));
}
Is there any BETTER way to HANDLE for-loop? Any help is appreciated.
The code that you have right now works perfectly, but is also O(n * m)
since removeIf
iterates through the List
for every Children
. One way to improve would be to store every child's personId
in a Set<String>
and remove every Person
from the List<Person>
if their personId
is contained in the Set
:
Set<String> childIds = childrenList.stream()
.map(Children::getPersonId)
.collect(Collectors.toSet());
personList.removeIf(person -> childIds.contains(person.getPersonId()));
Just another way of doing same but without mutating the original list:
Set<String> childIds = childrenList.stream()
.map(Children::getPersonId)
.collect(Collectors.toSet());
personList = personList.stream().filter(person ->
!childIds.contains(person.getPersonId())
).collect(Collectors.toList());
It should have a bit of increased space complexity but you could take advantage of parallelStream
here.
Adding this here in case someone needs it;
If what you want to do is not checking the contents, but an equalization, you can do the same code as follows;
listName.removeIf(listItem -> listItem.getName().equalsIgnoreCase("Name") ||
listItem.getName().equalsIgnoreCase("Other Name"));
This code is versatile and saved me lines of code and the need for a forEach loop.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.