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

标签 java validation arraylist

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

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/

相关文章:

java - 使用 Maven 构建项目

validation - 在字段旁边显示 JSF 验证错误

java - 在 javascript 函数中调用带有参数的 java 函数

c# - 禁用基于 DataGrid DataGridTextColumn 验证失败的按钮

java - 为什么我的 contains 函数没有检测到该元素?

java - 将数字添加到 arrayLists 的第一个元素

java - 如何从 int 数组中获取多个最小值?

java - 为什么我可以将整数文字分配给短类型变量而不是短类型方法参数?

java - Android:获取值/键位于 ArrayList<HashMap<String, String>> 中的整个数组

java - 使用 Spring Boot 构建的 AWS Kinesis 消费者的集成测试