如何从另一个 Supplier 创建一个 Supplier 并过滤掉一些项目?

How to create a Supplier from another Supplier and filter out some items?

假设 Supplier<Optional<Item>> 是来源,Supplier<Item> 是我们想要的:没有 Optional.Empty 个案例的相同项目。

给定 Supplier<Optional<Item>> optSupplier:

Supplier<Item> itemSupplier = () -> {
    Optional<Item> opt = optSupplier.get();
    while (!opt.isPresent()) {
        opt = optSupplier.get();
    }
    return opt.get();
};

当您尝试从项目供应商处 get 时,它会一直从可选供应商处拉取数据,直到获得不为空的结果,然后 return 项目。

(警告:如果可选供应商总是 return 是一个空可选,那么项目供应商将陷入无限循环。)

灵感来自 and :

Supplier<Item> filtered = Stream.generate(optSupplier)
        .flatMap(Optional::stream)
        .iterator()::next;

如果您是 Java 9 之前的人,请将 flatMap 替换为 .filter(Optional::isPresent).map(Optional::get)