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