首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据每个对象中的List<String>过滤List<Object>

根据每个对象中的List<String>过滤List<Object>
EN

Stack Overflow用户
提问于 2019-07-20 15:01:05
回答 2查看 99关注 0票数 4

我有一个List<Release>,每个Release都包含List<Attachment>

我想从每个List<Attachment>中删除除XY类型之外的所有附件。我想在Java 8中实现这一点。

我尝试了下面的代码。但它不起作用。

代码语言:javascript
复制
releases = releases.stream()
                .filter(release -> release.getAttachments().stream()
                        .anyMatch(att -> AttachmentType.X_TYPE.equals(att.getAttachmentType())
                                        || AttachmentType.Y_TYPE.equals(att.getAttachmentType())))
                        .collect(Collectors.toList());
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-20 15:12:16

您可以迭代您的发布列表,并使用removeIf删除不需要的附件:

代码语言:javascript
复制
Predicate<Attachment> isNotXorY = attachment -> !(AttachmentType.X_TYPE.equals(attachment.getAttachmentType()) || AttachmentType.Y_TYPE.equals(attachment.getAttachmentType()));

releases.forEach(release -> release.getAttachments().removeIf(isNotXorY));

正如@roookeee removeIf指出的那样,时间复杂度是

因为在下面它使用迭代器和它的remove方法。

作为另一种选择,您可以直接在集合上使用forEach并修改每个Release

代码语言:javascript
复制
Predicate<Attachment> isXorY = attachment -> AttachmentType.X_TYPE.equals(attachment.getAttachmentType()) || AttachmentType.Y_TYPE.equals(attachment.getAttachmentType());

releases.forEach(release -> {
        List<Attachment> filteredAttachments = release.getAttachments()
                .stream()
                .filter(isXorY)
                .collect(Collectors.toList());
        release.setAttachments(filteredAttachments);
});

为了获得更好的可读性,可以将这个嵌套的流提取到某个辅助方法中。

票数 3
EN

Stack Overflow用户

发布于 2019-07-20 15:04:09

你不需要在发布时使用filer,因为你想要删除附件,而不是发布。对附件使用筛选。使用release.stream().map和attachments.stream().filter

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57122519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档