过滤选项
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());
需要说明的几件事:
filter
方法来自 Stream<Subscriber>
,因此它需要 Predicate<Subscriber>
。但是,如果 Stream 类型是 Stream<Optional<Subscriber>>
这样的 filter(Optional::isPresent)
构造是可能的,因为它基本上意味着:
.filter(o -> o.isPresent())
Optional#isPresent
是实例方法,而不是 static
方法。如果您的意图是:
.filter(subscriber -> Optional.ofNullabe(subscriber).isPresent())
...它没有带来任何实际好处,最好使用:
.filter(Objects::nonNull)
由于 Stream 是 Stream<Subscriber
并且您没有从 Subcriber
创建 Optional
,因此可以省略 .map(Optional::get)
调用。只有当 Stream 是来自 DAO 调用的 Stream<Optional<Subscriber>>
时,以下结构才有意义。
List<Subscriber> subscribers = subscriber1_
.filter(Optional::isPresent)
.map(Optional::get)
...
我正在使用 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>
providedList<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());
需要说明的几件事:
filter
方法来自Stream<Subscriber>
,因此它需要Predicate<Subscriber>
。但是,如果 Stream 类型是Stream<Optional<Subscriber>>
这样的filter(Optional::isPresent)
构造是可能的,因为它基本上意味着:.filter(o -> o.isPresent())
Optional#isPresent
是实例方法,而不是static
方法。如果您的意图是:.filter(subscriber -> Optional.ofNullabe(subscriber).isPresent())
...它没有带来任何实际好处,最好使用:
.filter(Objects::nonNull)
由于 Stream 是
Stream<Subscriber
并且您没有从Subcriber
创建Optional
,因此可以省略.map(Optional::get)
调用。只有当 Stream 是来自 DAO 调用的Stream<Optional<Subscriber>>
时,以下结构才有意义。List<Subscriber> subscribers = subscriber1_ .filter(Optional::isPresent) .map(Optional::get) ...