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);
Share:
15,908
Muhammad Naeem Shahzad
Author by

Muhammad Naeem Shahzad

Updated on June 11, 2022

Comments

  • Muhammad Naeem Shahzad
    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
    Hulk over 5 years
    Depending on the sizes of the input lists it might be more efficient to create a Set instead of an ArrayList (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
    Guy over 5 years
    @Hulk It isn't necessary to create the copy if you don't mind loosing the original list.