gpt4 book ai didi

java - 根据每个对象内的 List 过滤 List
转载 作者:搜寻专家 更新时间:2023-11-01 02:56:41 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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 所指出的,时间复杂度为 O(n^2)因为在它下面使用迭代器和 remove 方法。

作为替代方案,您可以直接在集合上使用 forEach 并修改每个 Release :

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

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

关于java - 根据每个对象内的 List<String> 过滤 List<Object>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57122519/

25 4 0