Java 如果谓词中给出了所有条件,则获取所有匹配的非空元素

Java 如果谓词中给出了所有条件,则获取所有匹配的非空元素,java,java-8,predicate,Java,Java 8,Predicate,如何获取id=2的所有元素 下面的代码仅给出最后一个,即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&

如何获取id=2的所有元素

下面的代码仅给出最后一个,即
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());

    }   

}

只获取最后一个元素的原因是,第二个和第三个过滤器要求
cm.getUnitOfMeasureId()
cm.getMeasureTypeId()
为空。这只适用于最后一个元素。如果只想按
getId()
进行筛选,请删除其他筛选器:

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

根据您的编辑,您希望3个属性中至少有一个具有值,并希望检查所有非空值:

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

cm.getId()=“2”
-使用equals@Eran-我同意,但如果
getId()
为空,或者
getUnitOfMeasureId()
为空,或者
getMeasureTypeId()
为空,这将给出
NullPointerException
。@Eran-请重新打开,因为我已经编辑了这个问题。
getId()
可以返回空值,但需要进行空值检查<代码>cm.getId()!=null&&cm.getId().equals(“2”)。另外,
cm.getUnitOfMeasureId().equals(null)
将抛出NullPointerException或返回false。我想通过
getId()
getUnitOfMeasureId()
getMeasureTypeId()
进行筛选。但这三个都是动态的。所以哪一个是空的,我事先不知道。一种方法是使用多个if-else条件来检查什么是null,什么不是null,然后使用过滤器。但这很奇怪。谓词中没有任何方法可以帮我做到这一点吗?@MyGod如果你澄清确切的过滤逻辑应该是什么,我也许可以回答这个问题。在这个问题中,您只要求按一个字段进行筛选-
如何获取id=2的所有元素。请参阅上述问题中的“我的更新”。我只想要那些元素非空的对象。所以我不想让if-else条件检查什么是空的,什么不是空的。所以如果我将
channelMetadataDetail1.setId(“2”)
更改为
channelMetadataDetail1.setId(“8”)
,那么它不应该给这个对象。但根据您的编辑代码,它给出了id为8的
channelMetadataDetail1
。我只想要非空的匹配项。@MyGod给定
.filter(cm->cm.getId()==null | | cm.getId().equals(“2”)
filter,如果
cm.getId().equals(“8”)
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());