当前位置: 首页 > 知识库问答 >
问题:

在lambda表达式[重复]中设置一个变量

羊禄
2023-03-14

我想更新一个条目,如下所示:

public Entry updateEmail(String nom, EntryRequest entryReq) {
        Optional<Entry>  optional =  entryRepository.findByNom(nom);
        Entry updatedEntry = null;
        optional.ifPresent(entry -> {
            if(!StringUtils.isEmpty(entryReq.getEmail())){
                entry.setEmail(entryReq.getEmail());
            }
            updatedEntry = save(entry);
        });
        optional.orElseThrow(() -> new NotFoundException(this.getClass().getName()));
        return updatedEntry;
    }

此代码向我提供了以下错误消息

lambda表达式中使用的变量应该是最终的或有效的最终的

我该如何解决这个问题?

共有2个答案

桑睿识
2023-03-14

如果初始条目存在,实际上可以使用Optional的map方法来处理save:

public Entry updateEmail(String nom, EntryRequest entryReq) {
    Optional<Entry>  optional =  entryRepository.findByNom(nom);
    Entry updatedEntry = optional.map(entry -> {
        if(!StringUtils.isEmpty(entryReq.getEmail())){
            entry.setEmail(entryReq.getEmail());
        }
        return save(entry);
    }).orElseThrow(() -> new NotFoundException(this.getClass().getName()));
    return updatedEntry;
}

更简洁一点:

public Entry updateEmail(String nom, EntryRequest entryReq) {
    Optional<Entry>  optional =  entryRepository.findByNom(nom);
    return optional.map(entry -> {
        if(!StringUtils.isEmpty(entryReq.getEmail())){
            entry.setEmail(entryReq.getEmail());
        }
        return save(entry);
    }).orElseThrow(() -> new NotFoundException(this.getClass().getName()));
}
阴波峻
2023-03-14

不要在这里使用lambda

Optional<Entry>  optional =  entryRepository.findByNom(nom);
Entry updatedEntry = null;
if(optional.isPresent()){
    Entry entry=optional.get();
    if(!StringUtils.isEmpty(entryReq.getEmail())){
        entry.setEmail(entryReq.getEmail());
    }
    updatedEntry = save(entry);
});
optional.orElseThrow(() -> new NotFoundException(this.getClass().getName()));
return updatedEntry;

甚至更好

Optional<Entry>  optional =  entryRepository.findByNom(nom);
Entry entry=optional.orElseThrow(() -> new NotFoundException(this.getClass().getName()));
    if(!StringUtils.isEmpty(entryReq.getEmail())){
        entry.setEmail(entryReq.getEmail());
    } 
return save(entry);
 类似资料:
  • 如何在lambda表达式中将对象设置为另一个?我犯了错误

  • 我试图在forEach循环中使用lambda表达式将每个对象计算的字符串连接到变量“i”。 它给我带来了一个错误,因为外部变量必须是final才能在lambda表达式中使用。 但是如果我将变量设置为final,我就不能更改它,代码也不能工作。 有人有解决办法吗?

  • 我正在尝试在Java中使用Lambda表达式来理解以下方法参考代码: 我的问题是,为什么函数sameTemp只有一个参数?接口声明它必须有2个参数,所以对我来说没有意义。也许hTemp实例变量对这两个都足够了?我从Java完整参考书中获得了这一点,作者在那里解释了这一点: 块引用 在程序中,请注意HighTemp有两个实例方法:

  • 问题内容: 我有一个对象列表。首先,我需要按类型对其进行排序。比按faceValue。最后,总结所有数量: 结果列表必须仅包含3个新硬币对象: 怎么只用一个lambda表达式写出来呢? 问题答案: 您可以使用as 解决: 或进一步复杂的一个班轮分组,总和为:

  • 检查d1是否正确的最佳方法是什么。getDept()和d2。在进行比较之前,getDept()在以下lambda中是否为null?空检查应该在集合之前完成吗。sort()还是可以在lambda语句中完成? 我需要确保在尝试按部门排序之前,每个对象的部门数据不为空。