lukassz:
I'am usando primavera e I definido de feijão com ArrayList
. invites
é uma lista com Invite
objetos.
@Getter
public class Invite {
private String invitee;
private String email;
private boolean confirm;
private String token;
}
Esta é a minha classe privider dados:
@Getter
public class InvitationsData {
private List<Invite> invites = new ArrayList<>();
@PostConstruct
private void initInvites(){
invites.add(new Invite("John", "[email protected]", false, "6456453"));
invites.add(new Invite("John", "[email protected]", false, "3252352"));
}
}
Na classe de configuração que eu criei @Bean
a partir InvitationsData
- ele funciona.
No serviço que eu gostaria de modificar um objeto da lista que corresponde a seqüência de token e ter definido confirm
a false
.
invitationsData.getInvites()
.stream()
.filter(i -> token.equals(i.getToken()))
.filter(i -> !i.isConfirm())
.forEach(i -> {
i.setConfirm(true);
});
Este fluxo funciona bem. Agora, quando o método alguém chamada duas vezes para o objeto confirmado que eu gostaria de jogar CustomException
. Como posso fazer isso com esta corrente? Onde posso colocar orElseThrow
?
EDITAR:
Minha solução atual. Eu uso peek
em vez deforEach
invitationsData
.getInvites()
.stream()
.filter(i -> token.equals(i.getToken()))
.filter(i -> !i.isConfirm())
.peek(i -> i.setConfirm(true))
.findFirst()
.orElseThrow(() -> new InvitationConfirmedException("Error"));
azro:
Se o
token
é único você pode fazer:getInvites().stream() .filter(i -> token.equals(i.getToken())) .filter(i -> !i.isConfirm()) .findAny() .orElseThrow(IllegalArgumentException::new) .setConfirm(true);
Se não :
getInvites().stream() .filter(i -> token.equals(i.getToken())) .forEach(i -> { if (i.isConfirm()) throw new CustomException(); else i.setConfirm(true); });