java-8 - 是否可以在 Java8 流中重写此类代码?

标签 java-8 java-stream

我试图让它适应 Java 8 流:

public boolean isProcessionRestricted(CommonMessage message) {
    if (message.getClass() == BonusMessage.class) {
        log.debug("Staring validating BonusMessage: '{}'", message);
        BonusMessage bonusMessage = (BonusMessage) message;
        Optional<BonusTriggerConfig> config = bonusTriggerConfigRepository.getCached();
        if (config.isPresent()) {
            BonusTriggerConfig bonusTriggerConfig = config.get();
            List<BonusRewardConfig> rewardConfigs = bonusTriggerConfig.getRewardConfigs();
            if (!rewardConfigs.isEmpty()) {
                return rewardConfigs.stream()
                        .map(BonusRewardConfig::getBonusTypeId)
                        .noneMatch(bonusTypeId -> bonusTypeId == bonusMessage.getBonusTypeId());
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    return false;
}

但我遇到了检查流中的集合是否为空的问题。我得到的“最流畅”的东西看起来像这样:

@Override
public boolean isProcessionRestricted(CommonMessage message) {
    if (message.getClass() == BonusMessage.class) {
        log.debug("Staring validating BonusMessage: '{}'", message);
        BonusMessage bonusMessage = (BonusMessage) message;
        return bonusTriggerConfigRepository.getCached()
                .map(bonusTriggerConfig -> {
                    List<BonusRewardConfig> rewardConfigs = bonusTriggerConfig.getRewardConfigs();
                    return !rewardConfigs.isEmpty() && rewardConfigs.stream()
                            .map(BonusRewardConfig::getBonusTypeId)
                            .noneMatch(bonusTypeId -> bonusTypeId == bonusMessage.getBonusTypeId());
                }).orElse(false);
    }
    return false;
}

但我还是不喜欢。

最佳答案

您可以使用 Optional#filter改为过滤空集合,例如:

return bonusTriggerConfigRepository.getCached()
        .map(bonusTriggerConfig -> bonusTriggerConfig.getRewardConfigs())
        // v--- filter the empty configs out
        .filter(rewardConfigs-> !rewardConfigs.isEmpty())
        .map(rewardConfigs -> rewardConfigs.stream()
            .map(BonusRewardConfig::getBonusTypeId)
            .noneMatch(bonusTypeId -> bonusTypeId == bonusMessage.getBonusTypeId())
        )
        .orElse(false);

关于java-8 - 是否可以在 Java8 流中重写此类代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45595650/

相关文章:

Java 8 迭代列表内的列表和stream.map()

java-8 - Java 8 集合 - 过滤嵌套列表中的值

java - 如何使用 Java Stream 处理列表中的数据

java - 如何将多个谓词应用于 java.util.Stream?

java-stream - Jenkins 管道脚本将文件复制或移动到另一个目的地

tree - 是否可以使用 Java 8 Streams 构建 Tree 数据模型

java - 我可以结合按功能分组对流进行分区吗?

java - 使用java 8方式获取HashMap<T1, Set<T2>>的最小键和整数

java - 在 Java 8 中,如何应用此过滤器?

java - Stream.sorted() 然后收集,还是收集然后 List.sort()?