gpt4 book ai didi

java - 在 Java 7/Guava 中过滤集合的更干净的方法?

转载 作者:太空宇宙 更新时间:2023-11-04 13:35:53 25 4
gpt4 key购买 nike

我有以下类(class):

class ServiceSnapshot {
List<ExchangeSnapshot> exchangeSnapshots = ...
...
}

class ExchangeSnapshot{
Map<String, String> properties = ...
...
}

假设我有一个 ServiceSnapshot 集合,如下所示:

Collection<ServiceSnapshot> serviceSnapshots = ...

我想过滤该集合,以便生成的 ServiceSnapshots 集合仅包含包含 ExchangeSnapshots 的 ServiceSnapshots,其中 ExchangeSnapshots 上的属性与给定字符串匹配。

我有以下未经测试的代码,只是想知道是否有一种更清晰/更易读的方法来执行此操作,使用 Java 7,如果需要的话可能还可以使用 Google Guava?

更新:另请注意,我在下面提供的代码示例不适合我的目的,因为我使用 iterator.remove() 来过滤集合。事实证明我不能这样做,因为它正在修改底层集合,这意味着对下面的方法的后续调用会导致越来越少的快照,因为之前的调用将它们从集合中删除 - 这不是我想要的。

    public Collection<ServiceSnapshot> getServiceSnapshotsForComponent(final String serviceId, final String componentInstanceId) {
final Collection<ServiceSnapshot> serviceSnapshots = getServiceSnapshots(serviceId);
final Iterator<ServiceSnapshot> serviceSnapshotIterator = serviceSnapshots.iterator();
while (serviceSnapshotIterator.hasNext()) {
final ServiceSnapshot serviceSnapshot = (ServiceSnapshot) serviceSnapshotIterator.next();
final Iterator<ExchangeSnapshot> exchangeSnapshotIterator = serviceSnapshot.getExchangeSnapshots().iterator();
while (exchangeSnapshotIterator.hasNext()) {
final ExchangeSnapshot exchangeSnapshot = (ExchangeSnapshot) exchangeSnapshotIterator.next();
final String foundComponentInstanceId = exchangeSnapshot.getProperties().get("ComponentInstanceId");
if (foundComponentInstanceId == null || !foundComponentInstanceId.equals(componentInstanceId)) {
exchangeSnapshotIterator.remove();
}
}
if (serviceSnapshot.getExchangeSnapshots().isEmpty()) {
serviceSnapshotIterator.remove();
}
}
return serviceSnapshots;
}

最佳答案

使用 Guava :

Iterables.removeIf(serviceSnapshots, new Predicate<ServiceSnapshot>() {
@Override
public boolean apply(ServiceSnapshot serviceSnapshot) {
return !Iterables.any(serviceSnapshot.getExchangeSnapshots(), new Predicate<ExchangeSnapshot>() {
@Override
public boolean apply(ExchangeSnapshot exchangeSnapshot) {
String foundComponentInstanceId = exchangeSnapshot.getProperties().get("ComponentInstanceId");
return foundComponentInstanceId != null && foundComponentInstanceId.equals(componentInstanceId);
}
});
}
});

我可能在某处缺少或反转了 !,但基本策略是删除任何没有 ID 匹配的 ExchangeSnapshotServiceSnapshot 对象。

关于java - 在 Java 7/Guava 中过滤集合的更干净的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31703134/

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