Compare two lists of string using java stream

Viewed 17802

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

2 Answers

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);

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);
Related