【问题标题】:Filter and modify list object using java 8 streams使用 java 8 流过滤和修改列表对象
【发布时间】:2019-01-16 22:26:00
【问题描述】:

我正在使用 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放在哪里?

编辑:

我目前的解决方案。我使用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"));

【问题讨论】:

  • 令牌是唯一的还是多个邀请可以有相同的?
  • 你可以把支票放在forEach里面
  • @azro 令牌是唯一的

标签: java java-stream


【解决方案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);
                });
    

【讨论】:

  • 令牌不唯一时的代码,一旦抛出异常,它将跳过其他有效的代码..除非它在foreach中被捕获
猜你喜欢
  • 1970-01-01
  • 2021-12-20
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
  • 2016-09-21
相关资源
最近更新 更多