我正在尝试过滤另一个数据流内的流中的两个条件。 我需要做的是使用
name
参数检查对象是否存在,然后检查 Boolean
的 isGoldplated
属性是否为 true。
我尝试使用此代码,但没有工作,因为它没有通过
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);
}
}
}
我的问题是,如何将这两个循环转换为工作流?
您可以在
filter()
流上使用 pack.getSet().getCompressors()
,然后在 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());