Java Stream 过滤/查看同一部分中的两个不同条件

问题描述 投票:0回答:2

我正在尝试过滤另一个数据流内的流中的两个条件。 我需要做的是使用

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

我的问题是,如何将这两个循环转换为工作流?

java for-loop filter java-stream
2个回答
2
投票

您可以在

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

1
投票

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());
© www.soinside.com 2019 - 2024. All rights reserved.