过滤选项

Filtering Optionals

我正在使用 this,但是当我尝试以下 IDE 状态时

non-static method cannot be referenced from a static context"

Optional.isPresent()不是static方法吗?

public interface SubscriberRepo extends JpaRepository<Subscriber,Long> {
    Stream<Subscriber> findAllByShortName(String shortName);
}

public int exists(Subscriber subscriber) {
        try (Stream<Subscriber> subscriber1_ = subRepo.findAllByShortName(subscriber.getShortName().trim().toUpperCase(LocaleContextHolder.getLocale()))) {
            List<Subscriber> subscribers = subscriber1_
                .filter(Optional::isPresent)
                .map(Optional::get)
                .filter(s -> subscriber.getEnabled())
                .filter(s -> !subscriber.getLocked())
                .collect(Collectors.toList());
    }
}

下面是我尝试的另一种方法,只返回一个 List<Subscriber>,但我似乎无法“获取”Subscriber,因为错误是:

Required type List<Subscriber> provided List<List<Subscriber>>

如何安全地访问订阅者并将它们单独过滤到列表中?

List<Subscriber> subscriber1 = subRepo.findAllByShortName(subscriber.getShortName().trim().toUpperCase(LocaleContextHolder.getLocale()));
List<Subscriber> subscriber1_ = Stream.of(subscriber1)
            .filter(s-> subscriber.getEnabled())
            .filter(s-> !subscriber.getLocked())
            .collect(Collectors.toList());

需要说明的几件事:

  1. filter 方法来自 Stream<Subscriber>,因此它需要 Predicate<Subscriber>。但是,如果 Stream 类型是 Stream<Optional<Subscriber>> 这样的 filter(Optional::isPresent) 构造是可能的,因为它基本上意味着:

    .filter(o -> o.isPresent())
    
  2. Optional#isPresent 是实例方法,而不是 static 方法。如果您的意图是:

    .filter(subscriber -> Optional.ofNullabe(subscriber).isPresent())
    

    ...它没有带来任何实际好处,最好使用:

    .filter(Objects::nonNull)
    
  3. 由于 Stream 是 Stream<Subscriber 并且您没有从 Subcriber 创建 Optional,因此可以省略 .map(Optional::get) 调用。只有当 Stream 是来自 DAO 调用的 Stream<Optional<Subscriber>> 时,以下结构才有意义。

    List<Subscriber> subscribers = subscriber1_
            .filter(Optional::isPresent)
            .map(Optional::get)
            ...