如何计算元素并在Java 8中首先找到

Dan*_*ais 3 java lambda java-8

我有一个令牌列表,这个列表必须只包含一个具有活动状态的元素.如果没有一个状态等于活动的元素我需要抛出异常.

我想用lambda expresssions写这个,这是我的代码:

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)); 
Run Code Online (Sandbox Code Playgroud)

请注意,我两次抛出相同的异常.如何检查是否只有一个具有活动状态的元素并将其置于相同的lambda表达式中?

Era*_*ran 6

您最多可以创建List两个Tokens,然后检查其大小:

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);
Run Code Online (Sandbox Code Playgroud)