Отфильтруйте и измените объект списка, используя потоки Java 8 - PullRequest
0 голосов
/ 17 января 2019

Я использую весну, и я определил боб с ArrayList. invites это список с Invite объектами.

@Getter
public class Invite {

    private String invitee;
    private String email;
    private boolean confirm;
    private String token;
}

Это мой класс привилегированных данных:

@Getter
public class InvitationsData {

    private List<Invite> invites = new ArrayList<>();

    @PostConstruct
    private void initInvites(){
        invites.add(new Invite("John", "john@john.com", false, "6456453"));
        invites.add(new Invite("John", "john@john.com", false, "3252352"));
    }
}

В классе конфигурации я создал @Bean из InvitationsData - все работает.

В сервисе я хотел бы изменить один объект из списка, который соответствует строке токена и для confirm установлено значение false.

invitationsData.getInvites()
               .stream()
               .filter(i -> token.equals(i.getToken()))
               .filter(i -> !i.isConfirm())
               .forEach(i -> {
                   i.setConfirm(true);
               });

Этот поток работает нормально. Теперь, когда кто-то дважды вызывает метод для подтвержденного объекта, я хотел бы бросить CustomException. Как я могу сделать это с этим потоком? Где можно поставить orElseThrow?

EDIT:

Мое текущее решение. Я использую peek вместо forEach

invitationsData
                .getInvites()
                .stream()
                .filter(i -> token.equals(i.getToken()))
                .filter(i -> !i.isConfirm())
                .peek(i -> i.setConfirm(true))
                .findFirst()
                .orElseThrow(() -> new InvitationConfirmedException("Error"));

1 Ответ

0 голосов
/ 17 января 2019
  • Если token является уникальным , вы можете сделать:

    getInvites().stream()
                .filter(i -> token.equals(i.getToken()))
                .filter(i -> !i.isConfirm())
                .findAny()
                .orElseThrow(IllegalArgumentException::new)
                .setConfirm(true);
    
  • Если нет:

    getInvites().stream()
                .filter(i -> token.equals(i.getToken()))
                .forEach(i -> {
                    if (i.isConfirm()) 
                        throw new CustomException();
                    else 
                        i.setConfirm(true);
                });
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...