我正在使用spring,并且用ArrayList
定义了bean。 invites
是包含Invite
个对象的列表。
@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"));
}
}
在配置类中,我从@Bean
创建了InvitationsData
-有效。
在服务中,我想从列表中修改一个与令牌字符串匹配的对象,并将confirm
设置为false
。
invitationsData.getInvites()
.stream()
.filter(i -> token.equals(i.getToken()))
.filter(i -> !i.isConfirm())
.forEach(i -> {
i.setConfirm(true);
});
此流正常工作。现在,当有人为确认对象两次调用方法时,我想抛出CustomException
。我如何使用此视频流执行此操作?我可以在哪里放orElseThrow
?
编辑:
我当前的解决方案。我使用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"));
答案 0 :(得分:1)
如果token
是唯一,则可以执行以下操作:
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);
});