如何在Java8中计算元素并找到第一个

如何在Java8中计算元素并找到第一个,java,lambda,java-8,Java,Lambda,Java 8,我有一个令牌列表,该列表必须只包含一个处于活动状态的元素。如果没有一个元素的状态等于active,我需要抛出一个异常 我想用lambda表达式来写这个,这是我的代码: List<Token> listResult = tokenRepository.findByReference(tokenRefId); if (listResult == null || listResult.isEmpty()) { throw new IllegalStateException(Messa

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

我想用lambda表达式来写这个,这是我的代码:

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)); 
List listreult=tokenRepository.findByReference(tokenRefId);
if(listResult==null | | listResult.isEmpty()){
抛出新的IllegalStateException(未找到Messages.TOKEN);
}
if(listResult.stream().filter(t->t.getStatus().equals(TokenStatus.ACTIVE.code())).count()!=1){
抛出新的非法状态异常(消息。必须激活一个令牌);
}
Token Token=listResult.stream().filter(t->t.getStatus().equals(TokenStatus.ACTIVE.code()))
.findFirst().OrelsThrow(()->new IllegalStateException(消息。必须激活一个令牌));

请注意,我两次抛出相同的异常。如何检查是否只有一个元素处于活动状态,并在同一个lambda表达式中获取它

您可以创建最多两个
令牌的
列表
,然后检查其大小:

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);
已筛选列表=
listResult.stream()
.filter(t->t.getStatus().equals(TokenStatus.ACTIVE.code()))
.限额(2)
.collect(Collectors.toList());
如果(filtered.size()!=1){
抛出新的非法状态异常(消息。必须激活一个令牌);
}
令牌=已筛选。获取(0);