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

时间:2019-01-16 22:26:01

标签: java java-stream

我正在使用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"));

1 个答案:

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