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

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

是否可以在此处执行三元运算符或如何解决问题?

非常感谢您的帮助!


你不能使用三元运算符,因为 ifPresent() 函数期望提供的函数返回类型为 void。此外,你的三元运算符不是一个函数。最后,ifPresent() 只有在你有一个非空的 Optional 时才会运行,你可以使用 ifPresentOrElse() 函数。 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Optional.html#ifPresentOrElse(java.util.function.Consumer,java.lang.Runnable) - tgr
3个回答

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

三元运算符不能作为语句,它是一个返回结果的表达式。在您的情况下,actorInDatabase.isPresent() ? actorInDatabase.get() : actor 返回一个 Actor
另一个不错的替代方案是使用Optional#orElse -
actorForSaving.add(actorInDatabase.orElse(actor));

3
你的 if 很好。但是如果你 真的 想在这里使用条件运算符,做法就是在 add 的参数列表中使用它:
movieForSaving.getActors().forEach((actor) -> {
    Optional<Actor> actorInDatabase = actorService.findByNameAndSurname(actor.getName(), actor.getSurname());                        
    actorForSaving.add(actorInDatabase.isPresent() ? actorInDatabase.get() : actor);
});

您也可以尝试使用orElse。但是,您的问题似乎更关注条件运算符。(它是一个三元运算符--接受三个操作数的运算符--但并不是唯一的三元运算符。目前来说,在Java中它是唯一的三元运算符,但理论上可以添加另一个。)


2
错误已经解释过了。只需使用Streamy的方式来使用all和Optional:
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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接