代码之家  ›  专栏  ›  技术社区  ›  Renaud is Not Bill Gates

在lambda表达式内部设置变量[重复]

  •  0
  • Renaud is Not Bill Gates  · 技术社区  · 5 年前

    我想更新一个条目如下:

    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表达式中使用的变量应为final或effective 最终的

    我怎么解决这个问题?

    2 回复  |  直到 5 年前
        1
  •  3
  •   Antoniossss    5 年前

    这里不要用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);
    
        2
  •  1
  •   gil.fernandes    5 年前

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

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