使用Java8流过滤和修改列表对象

使用Java8流过滤和修改列表对象,java,java-stream,Java,Java Stream,我使用的是spring,我用ArrayList定义了bean邀请这是一个包含邀请对象的列表 @Getter public class Invite { private String invitee; private String email; private boolean confirm; private String token; } 这是我的数据私有类: @Getter public class InvitationsData { privat

我使用的是spring,我用
ArrayList
定义了bean<代码>邀请这是一个包含
邀请
对象的列表

@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"));
    }
}
这条小溪很好用。现在,当有人为确认对象调用两次方法时,我想抛出
CustomException
。如何使用此流执行此操作?我可以把
放在哪里

编辑:

我目前的解决方案。我使用
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"));
  • 如果
    令牌
    唯一的,您可以执行以下操作:

    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);
                });
    

令牌是唯一的还是多个Invite可以具有相同的?您可以将检查放在
forEach
@azro令牌是唯一的代码中。当令牌不唯一时,一旦引发异常,它将跳过其他有效令牌。。除非它就在foreach被抓到
getInvites().stream()
            .filter(i -> token.equals(i.getToken()))
            .forEach(i -> {
                if (i.isConfirm()) 
                    throw new CustomException();
                else 
                    i.setConfirm(true);
            });