Compare two lists of string using java stream
15,908
Solution 1
You don't need to compare
List<Integer> c = new ArrayList<>(a);
c.removeAll(b);
And if you don't mind loosing the original list data
a.removeAll(b);
Solution 2
Something like this should suffice:
Set<Integer> container = new HashSet<>(ListB);
ListA.stream()
.filter(id -> !container.contains(id))
.forEach(System.out::println);
or non-stream:
Set<Integer> container = new HashSet<>(ListB);
for(Integer id : ListA)
if(!container.contains(id));
System.out.println(id);
Author by
Muhammad Naeem Shahzad
Updated on June 11, 2022Comments
-
Muhammad Naeem Shahzad almost 2 years
I have two lists A and B. both have millions of elements. I want to compare and get all elements those are in list A but not in list B. Below is inefficient way to get elements.
if (!B.containsAll(A)) { for (Integer id : A) { if (!B.contains(id)) { System.out.println(id); } } }
I looking for an efficient way with or without streams to get elements
help is appreciated in this regards.
Thanks
-
Hulk over 5 yearsDepending on the sizes of the input lists it might be more efficient to create a
Set
instead of anArrayList
(but not necessarily, see stackoverflow.com/questions/28671903/…). Either way, while this is a simple and readable approach, it first creates a full copy of a list containing "millions of elements". -
Guy over 5 years@Hulk It isn't necessary to create the copy if you don't mind loosing the original list.