当前位置: 首页 > 知识库问答 >
问题:

使用Java 8流筛选和修改列表对象

赫连法
2023-03-14

我使用的是spring,我用arraylist定义了bean。邀请它是一个包含邀请对象的列表。

@Getter
public class Invite {

    private String invitee;
    private String email;
    private boolean confirm;
    private String token;
}

这是我的数据privider类:

@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"));
    }
}

在configuration类中,我从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"));

共有1个答案

宇文勇
2023-03-14

>

  • 如果令牌唯一,则可以执行以下操作:

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

  •  类似资料:
    • 我需要过滤一个列表

    • 任务: null 我的示例的输出:

    • ArrayList中有一个对象列表,我希望将修改为其复数名。 参考示例: 我们有什么方法可以使用Java8流实现相同的行为吗?

    • 我有一个包含一些字符串值的列表。我想与另一个字符串进行比较来迭代列表。只有当另一个字符串与列表中的任何元素都不匹配时,那么我才应该进入循环。我试过下面这样的东西,但没有效果。在Java8中有没有其他替代方法可以实现同样的功能? 注意:在循环中,我将向同一列表中添加更多的元素。因此,为了避免,我使用if条件进行验证。

    • 试图从结构中获取项目列表,避免大量的for循环和if,所以我想使用 例如,lets具有以下结构: 我要创建: null List TestitemsFiltered=House1.FamilyList.Stream().FlatMap(f->f.PersonList.Stream().FlatMap(p->p.ItemList.Stream().Filter(Item->Item.Name.Equ

    • 我正在尝试根据另一个列表中存在的值筛选一个列表。我已经经历了其他类似的问题,并试图利用这些来实现我的目标,但无法做到这一点。 列表1由类(L1)的对象组成 列表2由类(L2)的对象组成 因此,筛选后,列表1将不包含,因为该模型与中的不匹配。 我怎么能这么做?