过滤选项

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

不能从静态上下文中引用非静态方法"

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,因为错误是:

所需类型 List<Subscriber> 提供 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());
lisports 回答:过滤选项

有几点需要解释:

  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<Subscriber 并且您没有从 Optional 创建 Subcriber,因此可以省略 .map(Optional::get) 调用。仅当 Stream 是来自 DAO 调用的 Stream<Optional<Subscriber>> 时,以下构造才会再次有意义。

    List<Subscriber> subscribers = subscriber1_
            .filter(Optional::isPresent)
            .map(Optional::get)
            ...
    
本文链接:https://www.f2er.com/38082.html

大家都在问