Как превратить в троичный оператор? - PullRequest
6 голосов
/ 01 октября 2019

У меня есть оператор 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: синтаксическая ошибка на токенах, удалить эти токены.

Можно ли здесь выполнить троичный оператор или как я могу его решить?

Большое спасибо за помощь!

Ответы [ 3 ]

8 голосов
/ 01 октября 2019
actorForSaving.add(actorInDatabase.isPresent() ? actorInDatabase.get() : actor);

Тернарный оператор не может быть оператором, это выражение, которое что-то возвращает. В вашем случае actorInDatabase.isPresent() ? actorInDatabase.get() : actor возвращает Actor.

Другой хорошей альтернативой будет использование Optional#orElse как -

actorForSaving.add(actorInDatabase.orElse(actor));
3 голосов
/ 01 октября 2019

Твой 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 голосов
/ 01 октября 2019

Ошибка уже была объяснена. Просто 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);
...