如何在三元运算符中进行转换?

How to transform in ternary operator?

我有一个 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 行:令牌语法错误,删除这些令牌。

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

非常感谢您的帮助!

actorForSaving.add(actorInDatabase.isPresent() ? actorInDatabase.get() : actor);

三元运算符不能是语句,它是 returns 某物的表达式。在您的情况下,actorInDatabase.isPresent() ? actorInDatabase.get() : actor returns 和 Actor.

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

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

你的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 唯一的三元运算符,但理论上可以添加另一个。)

错误已经解释过了。只是使用 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);