[英]Filter and modify list object using java 8 streams
我正在使用 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"));
}
}
在配置类中,我从InvitationsData
创建了@Bean
- 它有效。
在服务中,我想修改列表中的一个对象,该对象与令牌字符串匹配并将confirm
设置为false
。
invitationsData.getInvites()
.stream()
.filter(i -> token.equals(i.getToken()))
.filter(i -> !i.isConfirm())
.forEach(i -> {
i.setConfirm(true);
});
此流工作正常。 现在,当有人为确认的对象调用方法两次时,我想抛出CustomException
。 我怎样才能用这个流做到这一点? 我可以把orElseThrow
放在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"));
如果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); });
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.