2017-10-16 13 views
2

J'ai une liste de jetons, cette liste doit contenir juste un élément avec l'état actif. S'il n'y a pas un élément avec un statut égal à actif, je dois lancer une exception.Comment compter les éléments et trouver d'abord en Java 8

Je veux écrire cela avec lambda Expresssions et ceci est mon code:

List<Token> listResult = tokenRepository.findByReference(tokenRefId); 
if (listResult == null || listResult.isEmpty()) { 
    throw new IllegalStateException(Messages.TOKEN_NOT_FOUND); 
} 

if (listResult.stream().filter(t -> t.getStatus().equals(TokenStatus.ACTIVE.code())).count() != 1) { 
    throw new IllegalStateException(Messages.ONE_TOKEN_MUST_BE_ACTIVATED); 
} 
Token token = listResult.stream().filter(t -> t.getStatus().equals(TokenStatus.ACTIVE.code())) 
       .findFirst().orElseThrow(() -> new IllegalStateException(Messages.ONE_TOKEN_MUST_BE_ACTIVATED)); 

Notez que je jette la même exception à deux reprises. Comment puis-je vérifier s'il n'y a qu'un seul élément avec un statut actif et l'obtenir dans la même expression lambda?

Répondre

6

Vous pouvez créer un List d'au plus deux Token s et vérifiez sa taille:

List<Token> filtered = 
    listResult.stream() 
       .filter(t -> t.getStatus().equals(TokenStatus.ACTIVE.code())) 
       .limit(2) 
       .collect(Collectors.toList()); 
if (filtered.size() != 1) { 
    throw new new IllegalStateException(Messages.ONE_TOKEN_MUST_BE_ACTIVATED); 
} 
Token token = filtered.get(0);