我试图在另一个数据流内部的流中过滤两个条件,我需要做的是检查对象是否存在通过使用"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());