我需要一种方法来检查列表中至少有一个元素与参数匹配。我已经弄明白了,但是这段代码很差而且很慢。
private static void validateAdvertisements(List<Advertisement> advertisements) {
List<Advertisement> inactiveAdvertisements = new ArrayList<>();
for (Advertisement advertisement : advertisements)
if (!advertisement.isActive()) inactiveAdvertisements.add(advertisement);
if (inactiveAdvertisements.size() == advertisements.size()) throw new NoAdvertisementAvailableException();
}
是否有 setter/getter 方法来做到这一点?
最佳答案
让你的逻辑短路。
因为只有在列表中没有 Activity 的 Advertisement
实例时才需要抛出异常,当遇到第一个 Activity 元素时 - 从循环中跳出。
private static void validateAdvertisements(List<Advertisement> advertisements) {
boolean isActiveNotFound = true;
for (Advertisement advertisement : advertisements) {
if (advertisement.isActive()) isActiveNotFound = false;
break;
}
if (isActiveNotFound) throw new NoAdvertisementAvailableException();
}
使用 Stream.noneMatch()
的基于流的解决方案,此操作是短路,只有在没有 Activity 对象时才会抛出异常。
private static void validateAdvertisements(List<Advertisement> advertisements) {
boolean isActiveNotFound = advertisements.stream()
.noneMatch(Advertisement::isActive);
if (isActiveNotFound) throw new NoAdvertisementAvailableException();
}
如果 NoAdvertisementAvailableException
是一个运行时异常,它可以传播到实现 JDK 标准功能接口(interface)的函数之外,例如 Runnable
.
这是一个使用组合 Stream.findFirst()
的示例+ Optional.ifPresentOrElse()
:
private static void validateAdvertisements(List<Advertisement> advertisements) {
advertisements.stream()
.filter(Advertisement::isActive)
.findFirst()
.ifPresentOrElse(s -> {},
() -> { throw new NoAdvertisementAvailableException(); }
);
}
关于java - 验证 ArrayList 的元素以匹配参数 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73748150/