【问题标题】:Filtering Optionals过滤选项
【发布时间】:2021-10-02 00:56:10
【问题描述】:

我正在使用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&lt;Subscriber&gt;,但我似乎无法“获取”Subscribers,因为错误是:

必填类型List&lt;Subscriber&gt; 提供List&lt;List&lt;Subscriber&gt;&gt;

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

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());

【问题讨论】:

标签: java spring java-8 spring-data-jpa optional


【解决方案1】:

有几件事要解释:

  1. filter 方法来自Stream&lt;Subscriber&gt;,因此它需要Predicate&lt;Subscriber&gt;。但是,如果 Stream 类型是 Stream&lt;Optional&lt;Subscriber&gt;&gt;,则可以使用这种 filter(Optional::isPresent) 构造,因为它基本上意味着:

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

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

    ...它没有带来真正的好处,而是更好地使用:

    .filter(Objects::nonNull)
    
  3. 由于流是Stream&lt;Subscriber,并且您没有从Subcriber 创建Optional,因此可以省略.map(Optional::get) 调用。只有当 Stream 是来自 DAO 调用的 Stream&lt;Optional&lt;Subscriber&gt;&gt; 时,以下构造才会再次有意义。

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

【讨论】:

  • 嗨,我认为来自存储库的所有集合查询都是 Collection> 类型,并将其作为 Stream 的流应该给我一个 Optional 流但我不能构造 filter(o->o.isPresent) 因为它只能“看到”订阅者。你能造就我吗?
  • 查询通常返回 Optional 或 Collection(组合,即 Optional 的 Collection 是奇数)。
猜你喜欢
  • 2014-12-20
  • 2012-05-26
  • 2013-11-06
  • 1970-01-01
  • 2016-10-31
  • 2020-07-21
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多