gpt4 book ai didi

java - 验证 ArrayList 的元素以匹配参数 (Java)

转载 作者:行者123 更新时间:2023-12-05 04:23:16 26 4
gpt4 key购买 nike

我需要一种方法来检查列表中至少有一个元素与参数匹配。我已经弄明白了,但是这段代码很差而且很慢。

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/

26 4 0