Java 8 可以在Java8流中重写这样的代码吗?

Java 8 可以在Java8流中重写这样的代码吗?,java-8,java-stream,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)

我试图将其适应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;
}
public boolean isProcessionRestricted(CommonMessage){
if(message.getClass()==BonusMessage.class){
调试(“启动验证BonusMessage:“{}”,消息);
BonusMessage BonusMessage=(BonusMessage)消息;
可选配置=bonusTriggerConfigRepository.getCached();
if(config.isPresent()){
BonusTriggerConfig-BonusTriggerConfig=config.get();
List rewardConfigs=bonusTriggerConfig.getRewardConfigs();
如果(!rewardConfigs.isEmpty()){
返回rewardConfigs.stream()
.map(BonusRewardConfig::getBonusTypeId)
.noneMatch(BonuTypeId->BonuTypeId==bonusMessage.GetBonuTypeId());
}否则{
返回false;
}
}否则{
返回false;
}
}
返回false;
}
但我在检查流中的集合是否为空时遇到了问题。我得到的“streammest”是这样的:

@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;
}
@覆盖
公共布尔值isProcessionRestricted(CommonMessage){
if(message.getClass()==BonusMessage.class){
调试(“启动验证BonusMessage:“{}”,消息);
BonusMessage BonusMessage=(BonusMessage)消息;
返回bonusTriggerConfigRepository.getCached()
.map(bonusTriggerConfig->{
List rewardConfigs=bonusTriggerConfig.getRewardConfigs();
return!rewardConfigs.isEmpty()&&rewardConfigs.stream()
.map(BonusRewardConfig::getBonusTypeId)
.noneMatch(BonuTypeId->BonuTypeId==bonusMessage.GetBonuTypeId());
}).orElse(假);
}
返回false;
}
但我仍然不喜欢它。

您可以使用它来过滤空集合,例如:

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

不管@JoeC的评论如何,我不确定是否最好将此操作转移到代码审查。但我从OP中学到了一些关于如何用Java8流API编写简明代码的知识,首先,这是我第一次尝试使用(我没有尝试使用本机流API,因为它对我来说太无聊了…)

(如果有一些编译错误,请帮助更新我的答案)。 但逻辑在我看来太复杂了。如果我是程序员,以下是我可以编写的代码:

public boolean isProcessionRestricted(CommonMessage message) {
    if (!(message insanceof BonusMessage && bonusTriggerConfigRepository.getCached().isPresent())) {
        return false;
    }

    log.debug("Staring validating BonusMessage: '{}'", message);     
    int restrictedBonusTypeId = ((BonusMessage) message).getBonusTypeId();
    List<BonusRewardConfig> rewardConfigs = bonusTriggerConfigRepository.getCached().get().getRewardConfigs();
    return rewardConfigs.size() > 0 && rewardConfigs.stream()
            .noneMatch(brc -> brc.getBonusTypeId() == restrictedBonusTypeId);
}
public boolean isProcessionRestricted(CommonMessage){
if(!(BonusMessage和bonusTriggerConfigRepository.getCached().isPresent()的消息){
返回false;
}
调试(“启动验证BonusMessage:“{}”,消息);
int restrictedBonusTypeId=((BonusMessage)消息).getBonusTypeId();
List rewardConfigs=bonusTriggerConfigRepository.getCached().get().getRewardConfigs();
返回rewardConfigs.size()>0&&rewardConfigs.stream()
.noneMatch(brc->brc.getBonusTypeId()==restrictedBonusTypeId);
}
我学到的或建议:

  • 忘记流API吧,它看起来很酷,但没那么酷。使用/不使用流API编写简洁的代码真的很酷
  • 虽然我喜欢Lambdas和streamapi。然而,与for循环/if/while相比,如何使用流API编写简洁的代码对我来说更具挑战性。最好一次又一次地检查流API,并在开始在实际产品中使用流API之前进行更多实践
  • 总是喜欢。有时用本机流API编写代码真的很无聊。提供了许多短而方便的方法来完成任务

  • 忘了流吧

    我不完全确定你在问什么。如果你问这是否可能,那么你已经清楚地表明答案是肯定的。如果你在问如何改进它,你最好去。是“非匹配”还是“任何匹配”!rewardConfigs.isEmpty()&&rewardConfigs.stream()…非匹配(…)不会使场景me@123-xyz:),我也尝试过的
    noneMatch
    anyMatch
    之间的行为是不同的。你可以看到我编辑的答案,我在写下答案后立即删除了
    anyMatch
    解决方案。OP只想在集合为空时返回
    false
    。听起来不错。将尝试实现。这个答案表明,如果您知道如何编写代码,即使不使用第三方库,您也可以编写代码。
    public boolean isProcessionRestricted(CommonMessage message) {
        if (!(message insanceof BonusMessage && bonusTriggerConfigRepository.getCached().isPresent())) {
            return false;
        }
    
        log.debug("Staring validating BonusMessage: '{}'", message);     
        int restrictedBonusTypeId = ((BonusMessage) message).getBonusTypeId();
        List<BonusRewardConfig> rewardConfigs = bonusTriggerConfigRepository.getCached().get().getRewardConfigs();
        return rewardConfigs.size() > 0 && rewardConfigs.stream()
                .noneMatch(brc -> brc.getBonusTypeId() == restrictedBonusTypeId);
    }