gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:07:29 24 4
gpt4 key购买 nike

我正在使用 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 - 它有效。

在服务中,我想修改列表中的一个对象,该对象与 token 字符串匹配,并将 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"));

最佳答案

  • 如果 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);
    });

关于java - 使用 java 8 流过滤和修改列表对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54226335/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com