【问题标题】:How to transform in ternary operator?如何在三元运算符中进行转换?
【发布时间】:2020-01-30 13:13:12
【问题描述】:

我有一个 if-then-else 语句,我想将它转换为三元运算符,但我不知道为什么我不能这样做。代码如下:

public Movie create(NewMovieDTO newMovieDTO) {
    Movie movieForSaving = NewMovieDTOToMovie.map(newMovieDTO);
    List<Actor> actorsForSaving = new ArrayList<Actor>();

    movieForSaving.getActors().forEach((actor) -> {
        Optional<Actor> actorInDatabase = actorService
            .findByNameAndSurname(actor.getName(), actor.getSurname());

        if(actorInDatabase.isPresent()) {
            actorForSaving.add(actorInDatabase.get());
        } else {
            actorForSaving.add(actor);
        }
    });
    movieForSaving.setActors(actorForSaving);
    return movieRepository.save(movieForSaving);
}

而带有三元运算符的代码是:

public Movie create(NewMovieDTO newMovieDTO) {
    Movie movieForSaving = NewMovieDTOToMovie.map(newMovieDTO);
    List<Actor> actorsForSaving = new ArrayList<Actor>();

    /*Line 1*/ movieForSaving.getActors().forEach((actor) -> {
        Optional<Actor> actorInDatabase = actorService
            .findByNameAndSurname(actor.getName(), actor.getSurname());
        /*Line 2*/(actorInDatabase.isPresent()) ? actorForSaving.add(actorInDatabase.get()) : actorForSaving.add(actor);
    /*Line 3*/});

    movieForSaving.setActors(actorForSaving);
    return movieRepository.save(movieForSaving);
}

IDE 给出以下错误:

第 1 行:此表达式的目标类型必须是函数式接口

第 2 行:此行有多个标记

            - Syntax error, insert "AssignmentOperator Expression" to complete Assignment

            - Syntax error, insert "}" to complete Block

            - actorForSaving cannot be resolved to a variable

            - Syntax error on token(s), misplaced construct(s)

            - actorInDatabase cannot be resolved

            - actorForSaving cannot be resolved

            - Syntax error, insert ";" to complete Statement

第 3 行:标记的语法错误,删除这些标记。

是否可以在这里执行三元运算符或如何解决?

非常感谢您的帮助!

【问题讨论】:

标签: java spring java-8 ternary-operator


【解决方案1】:
actorForSaving.add(actorInDatabase.isPresent() ? actorInDatabase.get() : actor);

三元运算符不能是语句,它是一个返回值的表达式。在您的情况下,actorInDatabase.isPresent() ? actorInDatabase.get() : actor 返回一个 Actor

另一个不错的选择是使用 Optional#orElse 作为 -

actorForSaving.add(actorInDatabase.orElse(actor));

【讨论】:

    【解决方案2】:

    错误已经解释过了。只是使用 all 和 Optional 的 Streamy 方式:

    Movie movieForSaving = NewMovieDTOToMovie.map(newMovieDTO);
    List<Actor> actorsForSaving = movieForSaving.getActors().stream()
            .map(actor -> actorService.findByNameAndSurname(actor.getName(),
                     actor.getSurname()).orElse(actor))
            .collect(Collectors.toList());
    
    movieForSaving.setActors(actorForSaving);
    

    【讨论】:

      【解决方案3】:

      您的if 很好。但是如果你真的想在这里使用条件运算符,方法是在add的参数列表中进行操作:

      movieForSaving.getActors().forEach((actor) -> {
          Optional<Actor> actorInDatabase = actorService.findByNameAndSurname(actor.getName(), actor.getSurname());                        
          actorForSaving.add(actorInDatabase.isPresent() ? actorInDatabase.get() : actor);
      });
      

      您也可以使用orElse。但是您的问题似乎专门针对条件运算符。 (这是 a 三元运算符 - 接受三个操作数的运算符 - 但不是 三元运算符。目前它是 Java 唯一的三元运算符,但理论上是另一个可以添加。)

      【讨论】:

        猜你喜欢
        • 2020-12-18
        • 2015-05-07
        • 2010-11-13
        • 2015-02-07
        • 2015-07-13
        • 2016-01-11
        • 2021-11-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多