Java 8流过滤器的行为异常(不过滤)

时间:2020-07-31 22:19:34

标签: java java-stream

任何人请在这个问题上帮助我。 我正在使用Java 8流api过滤器方法,但没有得到我期望的结果。 谁能解释我,为什么这段代码不起作用,比如说第一个过滤器不过滤:

List<Participant> participants = participantRepository.findAllByConferenceId(conferenceId);
    participants
            .stream()
            .filter(participant -> partIdSet.contains(participant.getParticipantId()))
            .filter(participant -> !ParticipantStatusCode.DISCONNECTED.equals(participant.getStatusCode()))
            .forEach(p -> {
                p.setStatusCode(ParticipantStatusCode.DISCONNECTED);
                p.getActivity().forEach(activity -> activity.setEndDatetime(TimeUtils.getTime()));
            });

但是以这种使用过滤器的方式,它可以正常工作

List<Participant> participants = participantRepository.findAllByConferenceId(conferenceId);
    participants = participants
            .stream()
            .filter(part -> partIdSet.contains(part.getParticipantId()))
            .filter(participant -> !ParticipantStatusCode.DISCONNECTED.equals(participant.getStatusCode()))
            .collect(Collectors.toList());
    
    participants.forEach(p -> {
                p.setStatusCode(ParticipantStatusCode.DISCONNECTED);
                p.getActivity().forEach(activity -> activity.setEndDatetime(TimeUtils.getTime()));
            });

另外,如果您有其他解决方案,可能会更好,更易读,请不要急于提出建议

1 个答案:

答案 0 :(得分:0)

原因是在两个示例中您都在改变使用者的输入,这不是使用流的预期方式。理想情况下,您需要不变的参与者以及一种创建新参与者并在以后收集它们的方法:

List<Participant> processedParticipants = participants.stream()
        .filter(participant -> partIdSet.contains(participant.getParticipantId()))
        .filter(participant -> !ParticipantStatusCode.DISCONNECTED.equals(participant.getStatusCode()))
        .map(p -> new Participant(
                ParticipantStatusCode.DISCONNECTED,
                p.getActivity().stream()
                    .map(...)
                    .collect(Collectors.toList()))
        .collect(Collectors.toList());