繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM