Search code examples
javajava-8predicate

get all matching non null elements if all the conditions are given in predicate


How to get all elements with id = 2?

The below code is giving only the last one i.e. channelMetadataDetail3:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;


public class APICheck {
    public static void main(String[] args) {

        List<ChannelMetadataDetails> channelMetadataDetails = 
        new ArrayList<ChannelMetadataDetails>();
        ChannelMetadataDetails channelMetadataDetail1 = 
        new ChannelMetadataDetails();
        channelMetadataDetail1.setId("2");
        channelMetadataDetail1.setUnitOfMeasureId("3");

        ChannelMetadataDetails channelMetadataDetail2 = 
        new ChannelMetadataDetails();
        channelMetadataDetail2.setId("2");
        channelMetadataDetail2.setUnitOfMeasureId("3");
        channelMetadataDetail2.setMeasureTypeId("5");

        ChannelMetadataDetails channelMetadataDetail3 = 
        new ChannelMetadataDetails();
        channelMetadataDetail3.setId("2");

        channelMetadataDetails.add(channelMetadataDetail1);
        channelMetadataDetails.add(channelMetadataDetail2);
        channelMetadataDetails.add(channelMetadataDetail3);

        channelMetadataDetails =channelMetadataDetails.
        stream().filter(cm -> cm.getId().equals("2")).
        filter(cm -> cm.getUnitOfMeasureId().equals(null)).
        filter(cm -> cm.getMeasureTypeId().equals(null)).
        collect(Collectors.toList());

    }   

}

NOTE:- If cm.getUnitOfMeasureId() is null then I will get NullPointerException

UPDATE:

In short, I only want those objects whose elements are non-null.

For example using for loop:

for (ChannelMetadataDetails cmEach : channelMetadataDetails) {
            if(cmEach.getId() != null && cmEach.getUnitOfMeasureId() == null && cmEach.getMeasureTypeId() == null) {
                channelMetadataDetails.stream().filter(cm -> cm.getId().equals("2")).collect(Collectors.toList());
            } else if(cmEach.getId() == null && cmEach.getUnitOfMeasureId() != null && cmEach.getMeasureTypeId() == null) {
                channelMetadataDetails.stream().filter(cm -> cm.getUnitOfMeasureId().equals("4")).collect(Collectors.toList());
            } else if(cmEach.getId() == null && cmEach.getUnitOfMeasureId() == null && cmEach.getMeasureTypeId() != null) {
                channelMetadataDetails.stream().filter(cm -> cm.getMeasureTypeId().equals("5")).collect(Collectors.toList());
            } else if(cmEach.getId() != null && cmEach.getUnitOfMeasureId() != null && cmEach.getMeasureTypeId() == null) {
                channelMetadataDetails.stream().filter(cm -> cm.getId().equals("2") && cm.getUnitOfMeasureId().equals("4")).collect(Collectors.toList());
            } else if(cmEach.getId() != null && cmEach.getUnitOfMeasureId() == null && cmEach.getMeasureTypeId() != null) {
                channelMetadataDetails.stream().filter(cm -> cm.getId().equals("2") && cm.getMeasureTypeId().equals("5")).collect(Collectors.toList());
            } else if(cmEach.getId() != null && cmEach.getUnitOfMeasureId() != null && cmEach.getMeasureTypeId() != null) {
                channelMetadataDetails.stream().filter(cm -> cm.getId().equals("2") && cm.getUnitOfMeasureId().equals("4") && cm.getMeasureTypeId().equals("5")).collect(Collectors.toList());
            }
        }

Solution

  • The reason you only get the last element is that your second and third filters require that cm.getUnitOfMeasureId() and cm.getMeasureTypeId() are null. That's only true for the last element. If you only want to filter by getId(), remove the other filters:

    channelMetadataDetails =
        channelMetadataDetails.stream()
                              .filter(cm -> cm.getId() != null && cm.getId().equals("2"))
                              .collect(Collectors.toList());
    

    EDIT:

    Based on your edit, you want at least one of the 3 properties to have a value, and you want to check all the not-null values:

    channelMetadataDetails =
        channelMetadataDetails.stream()
                              .filter(cm -> cm.getId() != null || cm.getUnitOfMeasureId() != null || cm.getMeasureTypeId() != null)
                              .filter(cm -> cm.getId() == null || cm.getId().equals("2"))
                              .filter(cm -> cm.getUnitOfMeasureId() == null || cm.getUnitOfMeasureId().equals("4"))
                              .filter(cm -> cm.getMeasureTypeId() == null || cm.cm.getMeasureTypeId().equals("5"))
                              .collect(Collectors.toList());