Java流过滤/peek同一节中的两个不同条件



我试图在另一个数据流内部的流中过滤两个条件,我需要做的是检查对象是否存在通过使用"name"参数,然后查看"isGoldplated"的布尔属性如果是真的,我尝试使用这段代码,但没有工作,因为它没有通过isGoldplated参数过滤:

List<CompressorModel> filteredCompressors = pack.getSet().getCompressors().stream()
.peek(p -> goldData.stream().map(GoldPlateData::getCompressorSerialNo).anyMatch(name -> name.equals(p.getGcsn())))
.peek(p -> goldData.stream().map(GoldPlateData::getIsGoldplated))
.collect(Collectors.toList());

所以我用了两个循环:

List<CompressorModel> filteredCompressors = new ArrayList<>();
for (CompressorModel cmp : pack.getSet().getCompressors()) {                
for(GoldPlateData gold: goldData) {                 
if( StringUtils.equalsIgnoreCase(cmp.getGcsn(), gold.getCompressorSerialNo()) && Boolean.TRUE.equals(gold.getIsGoldplated())) {
filteredCompressors.add(cmp);
}                   
}               
}

所以我的请求是,我怎么能把这两个循环转换成一个工作流?

thanks in advance

您可以在pack.getSet().getCompressors()流上使用filter(),然后在goldData中查找匹配,如下所示:

List<CompressorModel> filteredCompressors = pack.getSet()
.getCompressors().stream()
.filter(cmp -> goldData.stream().anyMatch(gd -> cmp.getGcsn().equalsIgnoreCase(gd.getCompressorSerialNo()) && gd.getIsGoldplated()))
.collect(Collectors.toList());

Peek基本上只用于调试目的。Peek有时可以完全不执行,因为它是一个终端操作。你可以在这里看到一个想法。

所以你可以修改你的实现来使用过滤器。

List<CompressorModel> filteredCompressors = pack.getSet().getCompressors().stream()
.filter(p -> goldData.stream().map(GoldPlateData::getCompressorSerialNo).anyMatch(name -> name.equals(p.getGcsn())))
.filter(p -> goldData.stream().map(GoldPlateData::getIsGoldplated))
.collect(Collectors.toList());